Javaな日々

NO JAVA, NO LIFE.

さくら VPS (CentOS 6.3) に LAMP を構築する - セキュリティ設定

  1. sudo の設定
    管理者権限を使う方法として,ユーザー切り替えの su コマンドで root ユーザーになる方法があるが,

    • 権限の範囲が指定できない
    • 管理者権限を使用したユーザーがわからない

    などのセキュリティ上の問題があるため,sudo コマンドを使う事が推奨されている.

    デフォルトでは sudo は root ユーザーのみが利用できる設定になっているため,先程設定した管理者グループ (wheel) で sudo が使えるように設定する.

    [root@www****** ~]# visudo

    visudo コマンドで開いた vi エディタで以下の行を探し,コメントアウトを解除する.

    # %wheel ALL=(ALL) ALL
    ↓
    %wheel ALL=(ALL) ALL

  2. su の設定
    su コマンドも wheel のユーザーのみが使用できるように設定を変更しておく.

    [root@www****** ~]# vi /etc/login.defs

    /etc/login.defs の最後の行に以下を追記.
    (2013/06/06 追記: 投稿時は SU_WHEEL_ONLY yes としていましたが,現在はこの記述で OK.)

    SU_WHEEL_ONLY

  3. ssh のポート番号変更 (任意)
    ssh のポート番号をデフォルト (22) のままにしておくと攻撃を受けることがあるため,ポート番号を変更しておく.

    [admin@www****** ~]$ sudo vi /etc/ssh/sshd_config

    /etc/ssh/sshd_config を以下のように書き換える.(xxxxx は一般的に他のアプリケーションと重複しない 10000 ~ 65535 の任意のポート番号を設定)

    #Port 22
    ↓
    Port xxxxx

    ssh を再起動してログインを確認する.

    [admin@www****** ~]$ sudo /etc/init.d/sshd restart
    sshd を停止中:                                             [  OK  ]
    sshd を起動中:                                             [  OK  ]
    [admin@www****** ~]$ exit
    logout
    Connection to XXX.XXX.XXX.XXX closed.

    サーバーとの接続を閉じ,変更したポートからログイン.

    $ ssh admin@XXX.XXX.XXX.XXX -p xxxxx (上で設定したポート番号)

  4. 公開鍵ログインの設定 (任意)
    個人の重要なデータを保存するサーバーの場合,パスワードによる ssh ログインを有効にしておくとセキュリティ上に問題があるとされるため,公開鍵暗号方式に切り替える.

    一旦サーバーとの接続を切る.

    [admin@www****** ~]# exit
    logout
    Connection to XXX.XXX.XXX.XXX closed.

    ローカル側で秘密鍵と公開鍵を作成.

    $ ssh-keygen -t rsa
    
    Enter file in which to save the key (/Users/name/.ssh/id_rsa): Enter
    Enter passphrase (empty for no passphrase): 任意のパスフレーズを設定
    Enter same passphrase again: もう一回入力
    Your identification has been saved in /Users/user/.ssh/id_rsa.
    Your public key has been saved in /Users/user/.ssh/id_rsa.pub.
    The key fingerprint is:
    xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@PC-Name.local
    The key's randomart image is:
    +--[ RSA 2048]----+
    |                 |
    |                 |
    |                 |
    |                 |
    |                 |
    |                 |
    |                 |
    |                 |
    |                 |
    +-----------------+
    $ cat ~/.ssh/id_rsa.pub
    ssh-rsa xxxxxxxx...xxxx user@PC-Name.local

    ~/.ssh/id_rsa.pub が作成されていることを確認.

    次にサーバー側の設定.
    先ほど作成した作業用のアカウントで ssh ログインし,公開鍵登録用の .ssh というディレクトリをホームディレクトリに作成,パーミッションを 700 に設定.

    $ ssh admin@XXX.XXX.XXX.XXX -p xxxxx 
    [admin@www****** ~]$ cd ~
    [admin@www****** ~]$ mkdir .ssh
    [admin@www****** ~]$ chmod 700 .ssh/
    [admin@www****** ~]$ exit
    logout
    Connection to XXX.XXX.XXX.XXX closed.

    一旦接続を閉じてローカルの公開鍵を scp コマンドを用いて公開鍵をサーバーにアップロード.

    $ scp ~/.ssh/id_rsa.pub admin@XXX.XXX.XXX.XXX:~/.ssh/authorized_keys
    id_rsa.pub                100%  408     0.4KB/s   00:00

    作業用ユーザーでサーバーにログインし,登録した鍵のファイルのパーミッションを 600 に設定.

    $ ssh admin@XXX.XXX.XXX.XXX -p xxxxx
    [admin@www****** ~]$ chmod 600 .ssh/authorized_keys

    ssh の設定を公開鍵認証方式に切り替える.

    [admin@www****** ~]$ sudo vi /etc/ssh/sshd_config
    
    We trust you have received the usual lecture from the local System
    Administrator. It usually boils down to these three things:
    
        #1) Respect the privacy of others.
        #2) Think before you type.
        #3) With great power comes great responsibility.
    
    [sudo] password for admin: 

    vi エディタで /etc/ssh/sshd_config を開き,以下のように書き換える.

    #PermitRootLogin yes
    ↓
    PermitRootLogin no # rootでのログインを禁止
    #PasswordAuthentication yes
    ↓
    PasswordAuthentication no # パスワード認証を禁止
    #PermitEmptyPasswords no
    ↓
    PermitEmptyPasswords no # 空のパスワードを禁止
    UsePAM yes
    ↓
    UsePAM no # PAMのパスワード認証を禁止

    ssh を再起動させて設定を適用.

    [admin@www****** ~]$ sudo /etc/init.d/sshd restart
    [sudo] password for admin: 
    sshd を停止中:                                             [  OK  ]
    sshd を起動中:                                             [  OK  ]

    これでリモートコンソールからと秘密鍵を持った PC から作業用ユーザーでログインすることしかできなくなる.手順にミスがあると ssh でのログインが出来なくなるため注意.
    念のためログインできることを確認.

    [admin@www****** ~]$ exit
    logout
    Connection to XXX.XXX.XXX.XXX closed.

    一旦サーバーとの接続を閉じ,ローカルから再度 ssh

    $ ssh admin@XXX.XXX.XXX.XXX -p xxxxx 

    ※ ここでログイン出来ない場合はさくら VPS の管理メニューのリモートコンソールからローカルの公開鍵 (~/.ssh/id_rsa.pub) とアップロードした公開鍵 (/home/admin/.ssh/authorized_keys) を比較して同じことを確認する.違っていればコピペするなり編集.


  5. iptables によるパケットフィルタ設定
    パケットフィルタリングは,IPアドレスやポート番号等の情報を元に通信データにフィルターをかけて,通過・遮断・転送・記録する機能.これを設定することによって無駄なトラフィックを減らしたり,セキュリティを向上させることができる.

    [admin@www****** ~]$ sudo vi /etc/sysconfig/iptables

    /etc/sysconfig/ に iptables というファイルを作成し,以下の内容を書き込む.
    (今回は SSH の使用を許可する場合の設定を記述した.実際は各自の用途に合わせて設定.)

    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :FIREWALL - [0:0]
    -A INPUT -j FIREWALL
    -A FORWARD -j FIREWALL
    -A FIREWALL -i lo -j ACCEPT
    -A FIREWALL -p icmp --icmp-type any -j ACCEPT
    -A FIREWALL -p 50 -j ACCEPT
    -A FIREWALL -p 51 -j ACCEPT
    -A FIREWALL -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
    -A FIREWALL -p udp -m udp --dport 631 -j ACCEPT
    -A FIREWALL -p tcp -m tcp --dport 631 -j ACCEPT
    -A FIREWALL -m state --state ESTABLISHED,RELATED -j ACCEPT
    # SSH (xxxxx は自分で指定したポート番号)
    -A FIREWALL -m state --state NEW -m tcp -p tcp --dport xxxxx -j ACCEPT
    
    -A FIREWALL -j REJECT --reject-with icmp-host-prohibited
    COMMIT

    設定した iptables を適用させ,フィルタリングの設定を確認する.

    [admin@www****** ~]$ sudo /etc/rc.d/init.d/iptables restart
    iptables: ファイアウォールルールを適用中:                  [  OK  ]
    [admin@www****** ~]$ sudo iptables -L
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    FIREWALL   all  --  anywhere             anywhere            
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    FIREWALL   all  --  anywhere             anywhere            
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain FIREWALL (2 references)
    target     prot opt source               destination         
    ACCEPT     all  --  anywhere             anywhere            
    ACCEPT     icmp --  anywhere             anywhere            icmp any 
    ACCEPT     esp  --  anywhere             anywhere            
    ACCEPT     ah   --  anywhere             anywhere            
    ACCEPT     udp  --  anywhere             224.0.0.251         udp dpt:mdns 
    ACCEPT     udp  --  anywhere             anywhere            udp dpt:ipp 
    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ipp 
    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:10022
    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited