さくらVPS設定その1 User+SSH+Firewall

さくらVPS設定まとめ の子エントリになります。


目次

  • User
  • SSH
  • Firewall
                                                                      • -

User

さくらVPSサーバーの起動を終えたら、まずはrootユーザの設定と普段利用するユーザの設定を行います。説明のために、%で始まるコマンドはrootユーザ、$で始まるコマンドはhogeユーザで実行することを表しています。*1

% passwd                          # rootのパスワードを設定
% useradd "hoge"                  # hogeというユーザを作成
% passwd "hoge"                   # hogeのパスワード設定
% yum list installed | grep sudo  # yumでsudoのインストール状況を確認
% usermod -G wheel “hoge”       # hogeをwheelグループへ追加
% id "hoge"                       # hogeの入っているグループを確認
% visudo                          # sudoが利用できるグループを設定
  %wheel ALL=(ALL) ALL            # ここのコメントアウトを外す
% echo $LANG                      # システムの言語設定状況を確認
% vi /etc/sysconfig/i18n          # システムの言語設定状況を確認
  LANG="ja_JP.UTF-8"              # 慣れ親しんだ祖国の言語に変更
% yum update                      # yumのシステムが古そうなので更新
% yum -y install vim-enhanced     # vimが古いので更新
% vim /etc/profile.d/vim.sh       # vimの設定を少し弄る
  % [ $tmpid -le 100 ] && return  # この行を"%"でコメントアウトする
$ su hoge                         # hogeユーザでログイン
$ vi ~/.bash_profile              # hogeユーザのbash設定を編集
  alias vi='vim'                  # viと入力してもvimを呼ぶ
  alias sudo='sudo '              # sudo viでもvimを呼ぶ黒魔法
  PATH=$PATH:/sbin                # /sbinにパスを通す
  PATH=$PATH:/usr/sbin            # /usr/sbinにパスを通す
  PATH=$PATH:/usr/local/sbin      # /usr/localsbunにパスを通す
$ source ~/.bash_profile          # 設定を読み込ませて反映させる


/etc/profile.d/vim.sh の設定に馴染みがないかもしれないので説明しておくと、これは起動時に読み込まれるファイルの1つで、予め「ユーザIDが100以下の場合にvimエイリアスを生成しない」という設定が記されています。ユーザidは上例でグループを確認する為に利用したコマンド「id 」で確認できます。hogeのユーザIDは500程度ですが、rootのユーザIDは0なので、vimエイリアスが読み込まれないことになります。そのため、ここでその条件分岐部分をコメントアウトしています。


また上例で「黒魔法」と読んだ「alias sudo='sudo '」ですが、この記述をしなければ、例えviでvimが呼ばれる環境でもsudo viではやはりviが呼ばれしまうことになります。しかし、何故この記述をすれば上手く行くのか挙動が追えず、検索してもなかなかアテがつかないため黒魔法と呼んでいます。有識者かエロい人の中で分かる人が居ればコメント頂けると助かります。

SSH

次はSSHの設定です。既にSSHでログインして作業されていることかと思いますが、標準のSSHの設定では少し頑張れば誰でも入れてしまうような脆弱な状態なので、少し設定を変えて強固にしてみましょう。

# [ローカル] ここでは仮にMacで操作しているものと仮定します
$ ssh-keygen                      # RSA鍵を作成(既にあれば作成不要)
$ scp -P 22 .ssh/id_rsa.pub hoge@hostname.sakura.ne.jp:/tmp
                                  # scpを利用してサーバーに鍵を渡します
# [さくらVPS]
$ mkdir ~/.ssh                    # 鍵を配置する.sshディレクトリを作成
$ sudo mv /tmp/id_rsa.pub ~/.ssh/authorized_keys
                                  # .ssh/内に適切な名前で鍵を置きます
$ chmod 700 ~/.ssh                # 読み書き実行権限を付けます
$ chmod 600 ~/.ssh/authorized_keys# 読み書き権限を付けます
$ su -                            # rootでログインします
% vi /etc/ssh/sshd_config         # sshの設定を編集します
  PermitEmptyPasswords no         # パスワード無しのログインを禁止
  RSAAuthentication yes           # RSA認証を許可
  PubkeyAuthentication yes        # 公開鍵認証を許可
                                  # 認証鍵ファイルを指定
  AuthorizedKeysFile .ssh/authorized_keys
  PasswordAuthentication no       # パスワード認証を非許可
  PermitRootLogin no              # rootログインを非許可
% /etc/rc.d/init.d/sshd restart   # SSHサービスを再起動して設定を反映


SSHサービスを再起動すると、鍵を渡しているユーザでないとログイン出来なくなります。違うPCやユーザからちょっと作業しようかな、みたいな時にこの設定のせいでパスワードではログイン出来なくなったりするので注意して下さい。

Firewall

標準の状態ではFirewallが設定されておらずセキュリティがZARUみたいなものですから、Firewall機能を提供するiptablesの設定を編集します。基本的には利用するポート(20, 21, 22, 80, 3000, 3306)を開けて他は閉じています。またローカルからのアクセスに対しては全て許可してあります。iptablesの設定は大きなwhen-case文みたいなものですから、1つずつのアクセスに対して上から条件を辿っていき、最終的にどの条件にも一致しなければ最後の文でREJECTされてアクセスが拒否されます。

% /etc/sysconfig/iptables
*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# FTP1, FTP2, SSH, HTTP, Rails, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3000  -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306  -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

% /etc/rc.d/init.d/iptables start # iptablesサービスを起動します
% chkconfig iptables on           # iptablesを自動起動するようにします
% chkconfig --list iptables       # 自動起動が設定されてるか確認します


以上でユーザ・SSH・Firewallの設定を終えました。次回のエントリではApacheMySQLWordPressについて説明します。私はサーバー構築初経験で検索しながら集めた情報を元に設定を行っているので、誤りや不効率な点が多々あります。お気付きの点があればコメントして頂ければ非常に助かります。

*1:具体的に言えば、.bashrc辺りにPS1="% "等と記述しているということになります