root権限付きのLinuxサーバを借りたらまずやること

さくらVPSを初めとした格安VPSや、AWSニフティクラウドなどの時間借りのできるIaaS環境など、これまでと比べものにならないほど安価に、root権限のあるLinux/Unixサーバを借りることができるようになりました。

root権限を渡されるということは、そのサーバを管理する権利と責任が移譲されたわけですので、セキュリティを含めたサーバにまつわる全ての運用を自分で行う必要があります。とはいえ、「何をしなければいけないのか」というのを漏れなく実施するのはなかなか大変です。

というわけで、自分なりのチートシートをまとめてみます。コマンド等はCentOS5準拠です。

ホスト名の設定

localhost.localdomainでは恥ずかしいしsyslog等にも残るので、ホスト名を設定します。

# vi /etc/sysconfig/network
HOSTNAME=hostname.example.jp (設定したいホスト名)
# hostname hostname.example.jp

パッケージアップグレード

なにはなくとも、まずは導入済みのパッケージをアップグレードします。

# yum update -y

個人ユーザの作成とsudo設定

ログインに用いる自分の個人ユーザを作成します。また、操作のログを取るという意味でも、基本的に作業は個人ユーザからsudo経由で行うべきですので、wheelグループを利用してsudo権限を設定します。

# useradd -m username -G wheel
# passwd username
(自分のパスワードを設定)
# visudo

sudoの設定は、visudoコマンド経由で行います。(たぶん)viが開くので、以下のように設定します。

root    ALL=(ALL)   ALL
%wheel  ALL=(ALL)   NOPASSWD: ALL

sudoするときにユーザのパスワードの入力をさせたい場合には「NOPASSWD:」を抜けば良いです。ただ、パスワードを入力させるのはログイン済みで放置されたコンソールから第三者が勝手に操作してroot権限を取ってしまうような場合には有効ですが、ネットワーク経由でしか利用しないサーバの場合にはそういうケースは余り起きないと思いますので、自分ではNOPASSWDにしてしまうことが多いです。

また、ディストリビューションによっては既に「Defaults requiretty」等が設定されている場合もありますが、わけがわからなければ問題が出るまではそのままで大丈夫です。(リモートからssh経由で直接sudoしたりする場合に問題となったりします。)

SSHを公開鍵ログインにする

SSHの認証は、パスワードではなく公開鍵を使いましょう。
これだけで1記事になってしまうので細かいやり方は割愛しますが、Windowsであればpageantを常駐させ、自分の鍵を追加した状態でPuTTYを利用するのがおすすめです。pageantであれば、最近のTeraTermWinSCPでも対応しています。

自分のユーザに公開鍵でログインでき、さらにそこからsudoが正しく実行出来ることを確認できたら、SSHの設定を変更し、公開鍵のみでのログインに設定を変更します。

% sudo vi /etc/ssh/sshd_config
( PasswordAuthenticationとChallengeResponseAuthenticationをnoに変更 )
% sudo /sbin/service sshd restart

ここで、今のSSHの接続は開いたままで、別のPuTTYやTerminalなどを立ち上げて、そこからもう一度自分のユーザにSSHでログインし、sudoができることを確認して下さい。できなくなっていたら、開いたままの前の接続の方から、今行った設定を確認してください。ここで間違えると、どこからもログインできなくなり、コンソールを提供しているサービス以外では修復ができなくなってしまいますので注意が必要なポイントです。

あと、端末側の設定が分かる人は、SSHの接続ポートをこの段階で変えても良いです。

ファイアウォール(パケットフィルタ)

サービスをあげたら個別に設定するとして、外からサーバへの接続はICMPとSSHだけ通します。その必要がなければ、サーバから外への接続(OUTPUT)は制限しません。
これだけであれば、だいたいこんな感じのルールになります。
ただし、複数のネットワークに接続しているサーバや、DHCPを利用しているサーバ(ニフティクラウド等)の場合には、既に設定されている内容を元にしてください。最悪の場合、IPアドレス等が設定されなくなり、SSH等でログインできなくなってしまいます。(そのようなサーバでは、初期からiptablesで同様の設定になっていることが多いようです。)

% sudo vi /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22   -j ACCEPT
-A INPUT -m state --state NEW -j DROP
COMMIT
% sudo /sbin/chkconfig iptables restart

不要なサービスの停止

例えばCentOS5であれば、acpid、udevd、syslogd、klogd、sshd、ntpd、sendmail、crond、mingetty/agettyぐらいが上がっていれば、サーバ自体の動作には十分です。
というわけで、ごっそり止めて自動起動も外します。

% for svc in NetworkManager  anacron atd auditd autofs avahi-daemon avahi-dnsconfd bluetooth conman cpuspeed cups dnsmasq dund firstboot gpm haldaemon hidd irda irqbalance iscsi iscsid kudzu lm_sensors lvm2-monitor mcstrans mdmonitor mdmpd messagebus multipathd netconsole netfs netplugd nfs nfslock nscd oddjobd pand pcscd portmap psacct rawdevices rdisc restorecond rpcgssd rpcidmapd rpcsvcgssd saslauthd smartd tcsd wpa_supplicant xfs xinetd ypbind; do
>    sudo /sbin/chkconfig $svc off
>    sudo /sbin/service $svc stop
> done

** SELinuxの無効化
SELinuxを正しく設定・運用する方法を理解している人はそのままで良いですが、分からないままだと何かと問題になるため、わからない人はSELinuxを無効にします。
>|sh|
% sudo vi /etc/sysconifg/selinux
SELINUX=disabled
( enforcingやpermissiveになっていたらdisabledに変更 )

性能監視

あとで困ってから調べるのでは、通常時との比較ができません。
とりあえずsysstatは入れます。

% sudo yum -y install sysstat
% sudo /sbin/service sysstat start
% sudo /sbin/chkconfig sysstat on

また、Webサーバであればmuninを入れると分かりやすいです。muninのパッケージはCentOS(RHEL)自体には入っておらず、追加レポジトリであるEPELが必要になるため、そのレポジトリ設定が含まれているepel-releaseパッケージを手動で追加します。

% wget http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
% sudo rpm -ivh epel-release-5-4.noarch.rpm
% sudo yum -y install munin munin-node
% sudo /sbin/service munin-node start
% sudo /sbin/chkconfig munin-node on

再起動

ここまでやったら、設定が正しく反映されるかの確認も含めて、サーバを再起動します。

% sudo reboot

再起動したあとに、

  • SSHで公開鍵を使ってログインができ、
  • sudo id が実行でき「uid=0(root) 〜〜」が表示され、
  • hostnameで設定したホスト名が表示され、
  • ps axで上記で上げたサービスだけが上がっている

ような状態になっていれば設定完了です。

追記(2011-05-02)

  • 停止するサービスにxinetd、iscsi、iscsidを追加
  • muninはEPELレポジトリだったのを忘れていたので、epel-releaseのインストールを追加