EagleLand

2015.01.07

CentOS 6系に対して行う最低限の設定

メモを掘り起こしたので、思い出すついでに記事にしてみる。VPSを借りて、ドメイン充ててみたり、ブログを置いてみたり、メールサーバー立ててみたりしていた当時(2年前)のメモなので、悪しからず。

ユーザーの作成と、SSHのログイン周りに制限をかけている。もちろん、サーバーを大量に用意するようなWeb現場でこういった設定をコツコツやるなんてことはまず無いけど、前提知識で持っているべきものだとは思う。

ので、chefだのansibleだのfabricだのについては触れていません。

サーバーへのログイン

sshコマンドの引数に、IPアドレスなりドメインなりのホスト名を渡してログインする。

$ ssh [hostname]

ログインすると~/.ssh/known_hostに、ホスト名とRSA公開鍵のフィンガープリントが記録される。ので、その後、公開鍵を変更して同一のホストにログインしようとすると失敗する。その場合は、~/.ssh/known_hostの該当のホスト名が記録されている行を削除してからやると良い。

ユーザーの作成

ログイン先のOSにrootではないユーザーを作成して、パスワードを設定する。

ユーザーを追加

$ useradd [username]

ユーザーの有効期限とかグループとかログインシェルといったような設定はuseraddのオプションで可能なので、ググってみてください。

パスワードを設定

$ passwd [username]

SSHログイン周りの設定

セキュリティを考慮して以下の2点を実施。sshdの設定を変更したいので/etc/ssh/sshd_configを編集。以下の修正をやったら、忘れずにデーモンの再起動をして変更を適用すること。

# sshdの設定ファイルを編集
$ vim /etc/ssh/sshd_config

# sshdを再起動
$ /etc/init.d/sshd restart

rootログインの拒否

もしrootでサーバーにログインされてしまうと大変なことになるのでやっておく。

PermitRootLogin no

sshポートの変更

不正ログインのリスクを低減させる意味で、デフォルトのポートである22から変えるべくPortの値を変更。

Port [portnumber]

ローカルの秘密鍵を利用してログインする設定

今回は、そのサーバー用のSSHキーを用意する。サーバーからログアウトしておく。

SSHキーの作成

ローカルでSSHキーを作成。

$ ssh-keygen -t rsa
$ Enter file in which to save the key...: hoge_rsa

-tで指定しているのは鍵の種類。ファイル名はhoge_rsaとしている。すると~/.ssh配下にhoge_rsaとその公開鍵hoge_rsa.pubが作成されているはず。

公開鍵をサーバーに登録する

先程作成した鍵ペアのうち、公開鍵をVPSに持っていてもらう。まず、サーバーにログインし、ホームディレクトリに.sshフォルダを作成。

$ cd ~
$ mkdir .ssh
$ chmod 700 .ssh

再びログアウトして、今度はローカルにある公開鍵hoge_rsa.pubをサーバーにコピー。先程の手順で22ポートではログイン不可になっているので、変更後のポート番号を指定する必要有り。

$ scp -P [portnumber] ~/.ssh/hoge_rsa.pub [username]@[hostname]:.

またまたサーバーにログインして、scpでコピーした公開鍵をauthorized_keysに登録。

$ cat hoge_rsa.pub > ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

これで公開鍵の登録自体はおしまい。後処理として、authorized_keysに登録が済んでいる公開鍵を削除して、sshdを再起動。

$ rm hoge_rsa.pub
$ /etc/init.d/sshd restart

実際に秘密鍵でログインする

ssh-iオプションで秘密鍵を指定。

$ ssh -p [portnumber] -i ~/.ssh/hoge_rsa [username]@[hostname]

ファイアーウォール

iptablesで最低限のファイヤーウォールを設定するべく、/etc/sysconfig配下のiptablesファイルを編集。なかったら作成。

$ cd /etc/sysconfig
$ vim iptables

iptablesファイルの中身のサンプル。

*filter
-A INPUT -i lo -j ACCEPT
-A INPUT -s 10.0.0.0/255.0.0.0 -j DROP
-A INPUT -s 172.16.0.0/255.240.0.0 -j DROP
-A INPUT -s 192.168.0.0/255.255.0.0 -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport [portnumber] -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT

保存したら、iptablesを再起動して設定を反映。

$ /etc/rc.d/init.d/iptables restart

ちなみに、CentOS 7からはiptablesサービスではなく、firewalldサービスが同じ/etc/sysconfig/iptablesファイルの設定でパケットフィルタリングをしてくれるみたい。

余談

Webサーバーの環境を用意するには、用途に応じて色々な方法がある。静的ファイルのみを置けたり、Wordpressが設置出来る(php+MySQL+…)といった所謂レンタルサーバーだったり、ParseのようなSaaSだったり、Herokuに代表されるPaaSだったり。AmazonのS3なりEC2なり。

とにかく、CentOSを自前で建てる必要がないケースも往々にしてあると思う。でもこうやってVPSを借りてWebサーバーを立ててみるように(もちろんVirtualBox+Vagrantでも)、原始的な部分を経験することは、Webに関する様々な事象の体系的な理解に必ず繋がる。

転職して間もない頃にインフラの知識がある人をとっ捕まえてやったんだけど、vimの基本操作とかのコマンドラインの初歩的な素養は此処で得たし、今更ながらやっててよかったと思ってる(小並感)。