2011/03/31

さくらのVPSを借りたら真っ先にやるべきssh設定

myfinderの技術や周辺的活動のblog

2010年9月23日木曜日

さくらのVPSを借りたら真っ先にやるべきssh設定

遅ればせながらさくらのVPS借りてセットアップしてます。
インターネットに晒すサーバを立てるときはまずセキュリティ設定をしっかりやってからIPを振るべきですが、さくらのVPSではそういうわけにもいきません。

なので、借りて真っ先に設定するべきssh設定について、自分がやっていることをまとめておきます。
今回はデフォルトの CentOS5.5(x86_64) でのやり方です。

1.ログインする

VPSを起動したらまずログインしてください。

2.ユーザ作成

作業用のユーザを作成します。

  1. # useradd myfinder  
  2. # passwd myfinder  
  3. # usermod -G wheel myfinder  


あとで root になれるユーザを制限するために wheel に所属させておきます。

3.ユーザの公開鍵を登録

作業用ユーザがリモートから入れるようにします。
ノーパスワードの設定はおすすめしません。

  1. # su - myfinder  
  2. $ ssh-keygen -t rsa  
  3. $ vi ~/.ssh/authorized_keys  


そのうち要ると思うので.sshを作っときます。
作成した authorized_keys に、作業するPCで作成した公開鍵を書いて、パーミッション設定を変えてください。

  1. $ chmod 600 ~/.ssh/authorized_keys  


4.sshdの設定変更

パスワードでの認証をやめ、公開鍵認証でのログインに限定します。

  1. # vi /etc/ssh/sshd_config  
  2. // no に設定  
  3. PermitRootLogin no  
  4. PasswordAuthentication no  
  5. UsePAM no  
  6. # /etc/init.d/sshd restart  


※umqさんの指摘でUsePAMの所を追加しました。ありがとうございます。
この時点でコンソール以外からのログインが不可能になります。

ここまでやったら作業用PCからログインして確認してください。

5.sudoの設定

作業用ユーザで sudo ができるよう設定を変更します。

  1. # visudo  
  2. // コメント外す  
  3. %wheel  ALL=(ALL)       ALL  


wheel に所属しているユーザが sudo できるようにします。
さきほど作業用ユーザは wheel に所属しているので、 sudo できるようになっている筈です。
下記のような感じで root になれるか確認するのがいいと思います。

  1. $ sudo su -  
  2. #  


6.rootパスワードの無効化

この時点で
・リモートからのパスワード認証不能
・公開鍵に対応する秘密鍵を持ったクライアントからのログイン以外不能
という状況になってます。

現実的にはこれでほぼほぼ問題ないと思いますが、rootのパスワードを管理したくないので、自分はよくこれを無効化しています。

  1. # passwd -l root  
  2. // とやると、/etc/shadowの内容が  
  3. root:!!hogehogehogehogehoge:xxxxx:0:99999:x:::  
  4. // という感じに無効化される  


こうしておけば
・リモートからのパスワード認証不能
・公開鍵に対応する秘密鍵を持ったクライアントからのログイン以外不能
・コンソールからの root ログイン不能
・作業用ユーザが sudo しない限りは root になることは不能
という感じになります。

ここまでの作業で、ログインして root になれるユーザを制限し、 root になるための手段を一本道にすることができました。

※h2ondaさんの指摘でrootのパスワードを無効化する所を変更しました。ありがとうございます。

7.sudoのログを取る

更に、 sudo した内容を syslog に記録する設定をします。
ここまでやっておけば、誰がいつ sudo したかが記録に残ります。

  1. # visudo  
  2. // 追記  
  3. # syslog facility  
  4. Defaults syslog=local3  
  5.   
  6. # vi /etc/syslog.conf  
  7. // 追記  
  8. # sudo log  
  9. local3.*                                                /var/log/sudo  


※kamipoさんの指摘でvisudoの所を追加しました。ありがとうございます。

  1. # touch /var/log/sudo  
  2. chmod 600 /var/log/sudo  


facility を local3 にしているのは、後でbindを立てる予定だからです。
これで /var/log/sudo に sudo した結果が下記のように残ります。

  1. # cat /var/log/sudo  
  2. Sep 23 20:01:41 hostname sudo: myfinder : TTY=pts/1 ; PWD=/home/myfinder ; USER=root ; COMMAND=/bin/su -  


複数台の環境ならば、このログを外部のsyslogサーバに転送すれば更によいと思います。
このログはこのままだと太っていってしまうので、 /etc/logrotate.d/syslog のローテーションに加えておきましょう。

  1. /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron /var/log/sudo {  
  2.    sharedscripts  
  3.    postrotate  
  4.    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true  
  5.    /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true  
  6.    endscript  
  7. }  


8.おわりに

ここまでやれば、割と安心してリモートから作業したり、運用できるかなと。
ただ、6と7については、やりたい人/必要な人がやればいいと思います。

作業用ユーザのパスワード忘れちゃったりした場合、コンソールから再起動してシングルユーザモードで入ればよいでしょう。

では。

0 件のコメント: