« MySQLのデータをシフトJISからUTF-8に変換した際の記録 | Main | 割と便利な帯域制限方法(Linux編) »

August 16, 2007

Linuxでそこそこ安全かつ楽にサーバを立てる方法

【1.初めに】
要望がありましたので、今回はLinux(実際はRedhat系Linux)でそこそこ安全かつ楽にサーバを立てる際の手順を記してみます。

※一応注意:今回は、試しにサーバを立てる程度であればこのくらいで十分ではないかと思うレベルを想定しています。サービスに投入するサーバでは私はもっと細かいところまで手を入れています。

【2.そこそこ安全かつ楽にサーバを立てる手順】
さて、いよいよ本題です。サーバを立てる際は、不必要なものを全て取り除いてから必要なものを追加していくというのが基本になります。以下の手順1~5では不要なものの除去、手順6~7で必要なものを追加し確認しています。それを踏まえまして。

■手順1. OSをインストールします。(私はLinuxであればCentOSを入れることが多いです。その際私はインストールの種類をカスタムにしパッケージグループの選択では開発ツール以外全部チェックを外すことが多いです)

■手順2. OSにrootでログインしたら、「yum update」で全てのパッケージをupdateします。

■手順3. 「chkconfig --list」で各サービスのrunlevelを確認し、不要なサービスを例えば「chkconfig gpm off」の要領で止めていきます。ちなみに私の場合だと以下のサービスだけ残してあとは全て止めてしまっています。

・syslog
・network
・iptables
・anacron
・smartd
・sshd
・crond
・xinetd
・ntpd

■手順4. 「netstat -ln」(もしくは「netstat -l」)で現在開いているポート番号を確認し、不要なネットワークサービスを止めていきます。

ただnetstat -lnだけだとどのプログラムからポート番号を開けているのかわからないので、それを確認するために「lsof -i」を実行します。

ここで例えばcupsd(631番ポート)が不要だと思えば「chkconfig cupsd off」で、vsftpd(21番ポート)が不要だと思えば「chkconfig vsftpd off」でそれを止めればいいわけです。

■手順5. リブートします。リブートが完了したら、試しに「netstat -an」や「ps -ef」を実行してみてください。最初と比べて不要なものがほとんどなくなりとてもすっきり感じるはずです。

■手順6. 必要なサービスを追加します。例えばhttpdであれば「yum install httpd」といった感じです。もちろん言うまでもなくソースコードを入手してコンパイルしてインストールする方法もあります。

■手順7. 最終確認です。「dmesg」「more /var/log/messages」「more /var/log/secure」「ps -ef」「netstat -an」などの出力結果を一通り眺めてみて特に変なところがなければ終わりです。もし少しでも変だと感じる点があったら是非徹底的に調べてみましょう。

さて、こうして構築されたサーバですが、最後に気をつけたいことが1つあります。それはポートを開いているプログラムにセキュリティホールがないかどうかです。例えば現在TCP22番ポートはopensshが、TCP80番ポートはapache2が開けているとします。外部からアクセスできるこの2つのポートにセキュリティホールがあったら問題なので、セキュリティホールのないバージョン(原則最新バージョン)であることを常に意識することが重要になります。

【3.最後に】
今回ご要望をいただいた方曰く「OSのインストール自体は何度もやったことがあるけど、サーバを立てるとなるといまいちどうやっていいかわからない」とのことです。この件繰り返しになりますが、サーバを立てる際は不必要なものを全て取り除いてから必要なものを追加していくというのが基本になります。その基本を踏まえて今回具体的な手順を記してみました。参考になりましたら幸いです。

|

« MySQLのデータをシフトJISからUTF-8に変換した際の記録 | Main | 割と便利な帯域制限方法(Linux編) »

Comments


はじめまして。
最低限ということであれば、sshdの設定で
こちらもお勧めです。

vi /etc/ssh/sshd_config
-----------------------
#PermitRootLogin yes

PermitRootLogin no
-----------------------

Posted by: f | August 16, 2007 07:36 PM

#PermitRootLogin yes

PermitRootLogin no
では何も変わっていないのでは…?

Posted by: p | August 17, 2007 01:16 AM

デフォルトがyesですから。

Posted by: yt | August 17, 2007 10:56 AM

これは
#PermitRootLogin yes
がデフォルトになってますよ、の意味なので明示的に
PermitRootLogin no
にしてやる必要がある、というおはなしですね?

Posted by: | August 17, 2007 11:36 AM

言葉不足ですみません。
上の方の説明のとおりです。
補足ありがとうございました!

Posted by: f | August 18, 2007 11:44 PM

lsof の使い方を知るのは重要なので、わざと上記のような例を挙げているのかもしれませんが、netstat でも PID と プログラム名がわかります。

# netstat -lnp

Posted by: kunitake | August 20, 2007 11:41 AM

何にも設定しないのだったらiptablesも動かしている意味ないのでは?

system-config-securitylevel-tuiあたりを紹介してあげましょうよ?

Posted by: よ | August 29, 2007 12:42 AM

上記の方。
人に期待しないで自分で紹介文書けばいいのに、なんてちょっと思いました。

Posted by: guest | August 31, 2007 03:51 PM

パッケージのアップデート等を行うと、
/sbin/chkconfig --listで停止させたサービスが
また復活している事もあるので、注意が必要ですね。

あと、sshd_configは
AllowUsersを明示するのも一つかもしれません。

Posted by: anon | December 01, 2007 08:51 PM

止めなきゃならないほど危険なものをインストールするのはなぜ?

Posted by: | December 10, 2007 09:57 PM

便利だから。ですよね。

車とか包丁に置き換えてみるとわかりやすいのではないでしょうか。

Posted by: | December 20, 2008 04:08 PM

>何にも設定しないのだったらiptablesも動かしている意味ないのでは?

これは後から設定するためにサービス起動自体は残しておくという意味でしょう。

削ってしまうと使うときに後から追加しないといけなくなってしまいます。

Posted by: Johann | June 06, 2009 06:55 AM

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference Linuxでそこそこ安全かつ楽にサーバを立てる方法:

» links for 2007-08-16 [気になる記事の書き出し帳]
パソコンについて質問してくる人へのオープンレター | P O P * ... [Read More]

Tracked on August 16, 2007 06:29 PM

» [Linux][netstat] netstatでポートを空けているプログラムを知る [よくきたはてダ]
ただnetstat -lnだけだとどのプログラムからポート番号を開けているのかわからないので、それを確認するために「lsof -i」を実行します。 sanonosa システム管理コラム集: Linuxでそこそこ安全かつ楽にサーバを立てる方法 私はnetstatのオプションは死んだおばあちゃんから... [Read More]

Tracked on August 19, 2007 01:50 AM

« MySQLのデータをシフトJISからUTF-8に変換した際の記録 | Main | 割と便利な帯域制限方法(Linux編) »