自分でサーバを構築して運用してみようと思い、DTI ServersManのVPSを契約しました。
これまではXreaのレンタルサーバを利用していたんですが、Javaを使ったWebアプリケーションサーバとして利用したかった事もあり、もっと自由に使えるように自分でサーバを構築してみようかと。
ServersMan@VPSを契約して、いろいろと初期設定を行ってみたので、その時の作業記録を残します。
正直、サーバーの構築・運用は初めてなので、Webや書籍で調べながらの試行錯誤; 間違っている所や、この設定入れるべきだよ!ってのがありましたら、コメントもらえると嬉しいです。
Standardプラン・シンプルセットを契約
ServersMan@VPSは契約プランが、安い順にEntryプラン(月額490円)、Standardプラン(月額980円)、Proプラン(月額1980円)の3つがありますが、Standardプランを契約しました。
また、OSはCentOSを選択。それ以外にも、DebianとUbuntuも選べるみたいですね。
CentOSの場合には、さらに4つからプランを選べます。シンプルセット、ディスクセット、ホームページセット、エンジニアセット。
Webサーバとして利用して公開して行きたかったので、セキュリティやメンテナンスを考えて、なるべくシンプルな構成からセットアップして行きたかったので、シンプルセットを選びました。
※ちなみに、この4つのセットはあとからでも変更可能です。
シンプルセットを選んで、OS初期化状態でVPSが利用開始となります。その状態から設定した内容を以下にメモして行きます。
※なお、サーバーへアクセスするためのローカルPCは、Macを使っています。Windowsを使用している方は、適時読み替えてください。
sshでサーバーにrootログインする
ローカルPC(MacOS)のターミナルを起動し、以下のコマンドを実行する。
パスワードを聞かれるので、契約時に発行されているrootログインパスワードを入力する。
$ ssh -l root VPSのIPアドレス -p 3843
※通常、sshのデフォルトでの使用ポーと番号は22ですが、ServersMan@VPSでは、3843番に変更されているため、ポート3843を指定して実行します。
詳細は、以下のDTIサポートページを参照。
http://dream.jp/support/announce/important/101207.html
rootパスワードの変更
何はともあれ、以下のコマンドで、rootパスワードを変更する。
$ passwd
新しいユーザーを作成し、管理者グループに追加
管理者用ユーザーを作成する。また管理者グループ「wheel」に追加する。
$ useradd -G wheel 新しいユーザー名
ついでにパスワードも設定する。
$ passwd 新しいユーザー名
sudoを実行できるユーザーへ登録(visudo)
管理者グループのユーザーに、sudoコマンドの実行を許可するため、以下のコマンドを実行して設定ファイルを編集する。
$ visudo
次の行を探して先頭にあるコメント(#)を外す。
%wheel ALL=(ALL) ALL
一度ログアウトし、作成した管理者ユーザーでログイン出来ることと、sudoコマンドを実行出来ること、su – コマンドでrootログイン出来ることを確認する。
※それを確認せずに、次の「rootログインを禁止する」を実行してしまうと、二度とサーバーへログイン出来なくなる可能性があるので危険。
sshでのrootログインを禁止する
SSHでのrootログインを禁止するため、以下のコンフィグファイルを変更する。
$ vi /etc/ssh/sshd_config
PermitRootLoginをyesからnoへ書き換える。
PermitRootLogin no
設定を反映させるため、sshデーモンを再起動する。
$ /etc/init.d/sshd restart
一度ログアウトし、rootログイン出来ないようになっていることを確認する。
以降は上記で作成した管理者ユーザーでログインし、
適時、sudoコマンドでコマンド実行する。(一部コマンドはrootログインして実行)
公開鍵認証でログインするようにする
SSHでサーバに接続する際に、パスワードによる認証ではなく、公開鍵認証でログイン出来るようにする。
ローカルPC(MacOS)で、公開鍵を作成する。
実行時にパスフレーズの入力を求められるので、適当な文字列を入力する。
※パスフレーズは後で利用するので覚えておく。
$ ssh-keygen↵
ローカルPCの「~/.ssh」フォルダに、秘密鍵「id_rsa」と公開鍵「id_rsa.pub」が作成される。
id_rsa.pubの内容をコピーし、サーバーの以下のファイルに追記する。
※ディレクトリ、ファイルが存在しなければ作成する。
~/.ssh/authorized_keys
上記フォルダ、ファイルのパーミッションを変更する。
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
一度ログアウトし、ローカルPCから再度SSHでログイン実行すると、
「Enter your password for the SSH key “id_rsa”.」と書かれたメッセージダイアログが表示される。
SSHの公開鍵を作成した際に入力したパスフレーズを入力し、OKボタンを押下する。
これで次回から、パスワード入力をせずに、鍵認証でログイン可能となる。
パスワードログインを禁止する
セキュリティ強化のため、パスワード入力でのログインを禁止し、
公開鍵認証でのログインのみ出来るように設定する。
※ローカルPCの秘密鍵、サーバ上の公開鍵を紛失してしまうとログイン出来なくなるので注意。
ローカルPCのHDDがご臨終とかしたらアウトなので、キーのバックアップは必須。
この設定をしたくなければ、飛ばしてもOK。
$ sudo vi /etc/ssh/sshd_config
PasswordAuthentication を、yesからnoへ変更
PasswordAuthentication no
設定反映するため、SSHデーモンを再起動する。
$ sudo /etc/init.d/sshd restart
システムの文字コードをUTF-8、日本語に変更
システム文字をUTF-8,日本語に変更するため、以下のファイルを編集。
$ sudo vi /etc/sysconfig/i18n
LANGを以下のように変更する。
LANG=”ja_JP.UTF-8″
一度ログアウト&ログインして、「df -h」コマンド等を実行し、
以下のように日本語が表示されればOK。
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/simfs 30G 714M 30G 3% /
ホスト名を変更する
rootでログインし、ホスト名を変更する。
$ su -
$ hostname 新しいホスト名
rootからログアウトする。
不要なデーモンを停止する
起動しているデーモンを表示する。
$ /sbin/chkconfig –list | grep on
ajaxterm 0:off 1:off 2:on 3:on 4:on 5:on 6:off
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
gpm 0:off 1:off 2:on 3:off 4:on 5:on 6:off
httpd 0:off 1:off 2:off 3:on 4:off 5:off 6:off
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
lm_sensors 0:off 1:off 2:on 3:off 4:on 5:on 6:off
lvm2-monitor 0:off 1:on 2:on 3:off 4:on 5:on 6:off
mcstrans 0:off 1:off 2:on 3:off 4:on 5:on 6:off
messagebus 0:off 1:off 2:off 3:off 4:on 5:on 6:off
netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off
netfs 0:off 1:off 2:off 3:off 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
portmap 0:off 1:off 2:off 3:off 4:on 5:on 6:off
rawdevices 0:off 1:off 2:off 3:off 4:on 5:on 6:off
restorecond 0:off 1:off 2:on 3:off 4:on 5:on 6:off
saslauthd 0:off 1:off 2:off 3:on 4:off 5:off 6:off
sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off
serversman 0:off 1:off 2:off 3:on 4:on 5:on 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
とりあえず利用しないもの、serversmanとrestorecondを停止してみる。
$ sudo /sbin/chkconfig serversman off
$ sudo /sbin/chkconfig restorecond off
何を停止するべきか、後で調べて追加で停止する予定。
メールはSendMailではなく、Postfixを使用したかったためsendmailも停止。
$ sudo /sbin/chkconfig sendmail off
不要なパッケージをアンインストールする
インストールされているパッケージを表示する。
$ yum list installed
たくさんパッケージ名が表示されるが、とりあえず使用しないserversmanと、samba、sendmailをアンインストールする。
$ sudo yum -y remove smadmin serversman
$ sudo yum -y remove samba*
$ sudo yum -y remove sendmail
Postfixをインストール、起動
メールにはPostfixを利用しようかと思うので、インストールして起動しておく。
$ sudo yum install postfix
$ sudo /etc/init.d/postfix start
全パッケージをアップデート
以下のコマンドで、アップデート可能な全パッケージをアップデート実行する。
$ sudo yum update
パケットフィルタを設定
パケットフィルタリングを行うため、iptablesの設定を行う。
以下のコマンドを実行し、iptablesがランレベル2〜5で起動していることを確認する。
$ /sbin/chkconfig –list | grep iptables
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
取り急ぎ、Webサーバ、SMTPサーバ、POPサーバ、SSHぐらいしか使わないので、外部からのアクセスはそのサービスで利用しているポート番号のみを許可するようにしました。あとは、DNS応答とICMPの受信も許可。外部へのパケット送信は全て許可にしています。
以下、個別の設定の詳細。
- 外部からのWebサーバ接続用に、TCP – Port:80を接続許可する。
$ sudo /sbin/iptables -A INPUT -p tcp –dport 80 -j ACCEPT
- 外部からのSMTP接続用に、TCP – Port:25を接続許可する。
$ sudo /sbin/iptables -A INPUT -p tcp –dport 25 -j ACCEPT
- 外部からのPOP接続用に、TCP – Port:110を接続許可する。
$ sudo /sbin/iptables -A INPUT -p tcp –dport 110 -j ACCEPT
- 外部からのSSH接続用に、TCP – Port:3843を接続許可する。※SSHをPort:3843に設定している場合。
$ sudo /sbin/iptables -A INPUT -p tcp –dport 3843 -j ACCEPT
- ICMPパケットの受信を許可する
$ sudo /sbin/iptables -A INPUT -p icmp -j ACCEPT
- DNS応答の受信を許可する
$ sudo /sbin/iptables -A INPUT -p udp –sport domain -j ACCEPT
- サーバから接続開始したTCP通信の受信パケットを許可する
$ sudo /sbin/iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
- それ以外のポート番号への、外部からの接続を禁止する。
$ sudo /sbin/iptables -P INPUT DROP
※くれぐれもSSHで利用しているポート番号の許可をした上で、このコマンドを実行することに注意する。間違えた場合、サーバを再起動しないとSSHアクセスが出来なくなる。
- iptablesの設定を確認する。
$ sudo /sbin/iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:http
ACCEPT tcp – anywhere anywhere tcp dpt:smtp
ACCEPT tcp – anywhere anywhere tcp dpt:pop3
ACCEPT tcp – anywhere anywhere tcp dpt:quest-agent
ACCEPT icmp – anywhere anywhere
ACCEPT udp – anywhere anywhere udp spt:domain
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHEDChain FORWARD (policy ACCEPT)
target prot opt source destinationChain OUTPUT (policy ACCEPT)
target prot opt source destination
- 間違いが無ければ、以下のコマンドで設定をファイルに保存する。
$ sudo /etc/init.d/iptables save
※保存しておかないと、コマンドで設定したルールは、サーバ再起動時に消えてしまう。
とりあえず終了
とりあえずここまで。他にも設定するべき事を調べてやって行きたいと思います。
また、これらの設定を行う上で、参考にさせて頂いたサイトも記載しておきます。
参考サイト:
「MAKIZOU.COM」http://www.makizou.com/archives/2053
「zundairo」http://d.hatena.ne.jp/zundairo/20101029/ServersMan_VPS
<2011/04/06 修正>
iptablesの設定に、INPUTチェインへ、ICMPパケットの受信、DNS応答パケットの受信、サーバから接続開始したTCP通信の応答パケットの受信を許可する設定を追加しました。
上記のiptables設定は、HTTPの送受信が出来ること、SMTP,POP3の送受信が出来ること、ICMPv4の送受信が出来ること、SSHの送受信が出来ることしか、基本的には設定していません。
あとは、サーバ側から送信したDNSの応答、サーバ側から開始したTCP通信の応答パケットを受信出来るように許可しています。
iptablesの設定としては貧弱な内容だと思いますので、あくまで参考程度に見てください。
ホスト名の変更は /etc/sysconfig/network ファイルを編集した後に OS を再起動。
名前解決できるよう /etc/hosts ファイルのループバックアドレス行も編集。
・・・ってのが一般的かな。
おお、コマンドで変更するだけじゃないんだね。
あのコマンドを実行することで、どのファイルの中身が編集されているのかも気になるところだけど。。。
参考になります。
ブログ読んでくれた方の指摘で気づいたのですが、ところどころコマンドのオプションがおかしく表示されてしまっています。
iptablesコマンドのオプションで、「-dport」と表示されていますが、「- – dport」が正しいです。
WordPressが連続したハイフンを、1つのハイフンに勝手に変換してしまっているようです。WordPressの変換処理に手を加えれば直るそうなので、これから修正したいと思います。
それまでの間、ご迷惑をおかけしますがよろしくお願いします。
これは多分ブログの仕様かなにかで-になってるのでは??
ブログの仕様かというご質問ですが、
WordPressの実装仕様という意味だとYesです。
ブログ全般の仕様かという意味でしたら、Noです。
Htmlには仕様はありますが、ブログ(CMS)には無いはずですので。
WordPressがHtmlの特定記号文字を、エスケープ文字へ変換するのですが、
そこの処理があまりイケてないように思います。
エスケープ文字へ変換すること自体は、HTMLの仕様上正しいのですが、変換ルールがイマイチかと。。。
[...] DTI ServersMan@VPS 最初にやったこと | Creative Gear [...]