apache+phpはデフォルトでは第三者に対してサーバーのバージョンを公開する設定になっています。
攻撃者に余計な情報を与えないようにするため、以下のように設定しました。
・httpd.conf
ServerTokens ProductOnly
ServerSignature Off
・php.ini
expose_php = off
ウェブサーバーの設定(ServerTokens,ServerSignature,expose_php)
mtaをsendmailからpostfixにする
まずはyumを使ってサクサクっとpostfixをインストール。
http://fedorasrv.com/postfix.shtml
↑こちらのページを参考にさせていただきました。
で、MTAの切り替えにはalternativesというコマンドが使えることを知りました。
# alternatives –config mta
これを実行してpostfixをmtaにすると、シンボリックリンクを張ったりしてmta入れかえをしてくれるんです。いやー便利だ。
PECL(PHP拡張モジュール)でモジュールを導入する
jsonモジュールを使おうと思ったら、php5.1系だったのでモジュールが含まれていない。というわけでモジュールを入れようと思い、調べてみたらpeclコマンドで簡単に導入できるとのこと。
こんな感じ。
# pecl install json
pearと全く同じですね。
ただ、自分の環境だと
running: phpize
sh: phpize: command not found
というエラーが出てしまいました。
phpizeが、、ない
phpizeはphp-develというパッケージを入れればOKです。ソースコンパイルの場合はデフォルトで付属します。
# yum install php-devel
やり直したら、見事成功!
で、php.iniに
extension=json.so
を追加して完了です。
Linuxのカーネルバージョンを調べるには
unameコマンドで分かります。
uname -m //CPUのタイプを表示する
uname -n //PCのホスト名を表示する
uname -r //カーネルのバージョンを表示する
uname -s //OS名を表示する
uname -v //OSのリリース日を表示する
uname -a //すべての情報を表示する
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/068infokernelver.html
yumでパッケージを削除するには
新しいサーバーが届いて、現在環境構築中。
yum関係をいじっており、yum list installed したらpostgresが入っていた。
postgresは使わないのでアンインストールしたい。そんなときはグループごとまとめて削除するのが楽です。
# yum groupremove “PostgreSQL Database”
まとめて一気に引っこ抜けるので、すごくさっぱりします。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/678yumgroup.html
selinuxを無効にする
CentOS4.5をインストールすると、selinuxというのがもれなくインストールされます。(インストール時のオプションだったかも)
selinuxについてまったく知らなかったので、軽く調べてみました。
selinuxは「Security Enhanced Linux」の略で、セキュリティを高めるためのものだそうです。しっかり設定すると堅固なセキュリティを組むことができるんだそうです。
なるほど、機会があったらしっかり勉強してみるのもいいかもしれないな、、、とは思うんですが、いまのところまだあまり普及していない様子。また、きちんと理解しておかないとトラブルが起こった時の原因の切り分けにおいて手間がかかってしまうそうです。
導入するのは時期尚早かな、、、という感じ。
というわけで無効にすることに。
# vi /etc/selinux/config
SELINUX=enforcing
↓
SELINUX=disabled
これで再起動後にはselinuxは無効になります。
再起動せずに無効にしたい場合は、
# /usr/sbin/setenforce permissive
でOK。
iptablesの勉強
iptablesについて、けっこう頑張って勉強したのでまとめてアップします。
iptablesは多機能でいろんなことができるようですが、この記事では単体サーバーで、外部からのアクセスを全部遮断し、サービスを行うポートのみ特定(または不特定)のユーザーに対して開放するという点のみを書きます。ルーター機能とかについては触れません。
まずiptablesコマンドの使い方ですが、説明は割愛します。この記事の最後に参考サイトをリンクしたのでそちらをごらんください。
さっそくですが、具体例を示します。
以下は入ってくるパケットを全部拒否(DROP)し、80番ポート(http)は全開、22番ポート(ssh)は192.168.1.0/24のみ許可という設定です。
1. iptables -P OUTPUT ACCEPT
2. iptables -P FORWARD DROP
3. iptables -P INPUT DROP
4. iptables -A INPUT -i lo -j ACCEPT
5. iptables -A INPUT -p icmp -j ACCEPT
6. iptables -A INPUT -m state –state ESTABLISHE,RELATED -j ACCEPT
7. iptables -A INPUT -p tcp –dport 80 -j ACCEPT
8. iptables -A INPUT -p tcp –sport 80 -j ACCEPT
9. iptables -A INPUT -p tcp -s 192.168.1.0/24 –sport 22 -j ACCEPT
10. iptables -A INPUT -p tcp -s 192.168.1.0/24 –dport 22 -j ACCEPT
行ごとに説明します。
まず1~3行目。「-P」オプションは基本ルールの設定です。後述する「-A」のルールに当てはまらないパケットにはすべて「-P」の処理が行われます。
1. 内部から外部へのパケット(OUTPUT)を許可(ACCEPT)
2. サーバーを経由して転送されるパケット(FORWARD)をすべて破棄(DROP)
3. 外部から内部へのパケット(INPUT)をすべて破棄(DROP)
4~6行目はそれぞれ以下の意味を持っています。
4. ループバックアドレスからのパケット(自分自身からのパケット)を許可
5. icmp(ping)のパケットを許可
6. ESTABLISHED(確立済みのコネクション)とRELATED(新しいコネクションだがFTPデータ転送やICMPエラーのように既存の接続に関係する)のパケットを許可
7~10行目は特定ポートでのサービスへのパケットの処理です。
7. 80番ポートへのパケットを許可(dportは宛先ポートの指定)
8. 80番ポートへのパケットを許可(dportは送信元ポートの指定)
9. 22番ポートへのパケットを192.168.1.0/24に対してのみ許可(dportは宛先ポートの指定)
10. 22番ポートへのパケットを192.168.1.0/24に対してのみ許可(dportは送信元ポートの指定)
以上でこのサーバーは80と22以外は外部からのアクセスはすべて破棄されるようになりました。
さて、ここでいくつか注意点を。
まず上記のコマンドは、コンソールから実行しないといけません。リモートから実行した場合、3行目を実行した時点で「外部から内部へのパケット(INPUT)をすべて破棄(DROP)」されてしまうので、切断されてしまいます。
というわけなので、リモートからの作業の場合には「iptables -P INPUT DROP」は一番最後に実行してください。
あと6行目の「iptables -A INPUT -m state –state ESTABLISHE,RELATED -j ACCEPT」。
この設定をしておけばたとえ途中で設定を間違えてしまっても、その時点で接続が切れることはなくなります。たとえばsshのルールを間違えて設定したとしても突然接続が切れたりしないので安心です。
だいたいこんなところです。
あと実際に本番機でルールを設定する時は、iptablesコマンドを使うより/etc/sysconfig/iptablesのスクリプトを編集したほうがいいと思います。上の例をスクリプトにすると、
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp –dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp –sport 80 -j ACCEPT
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp -m tcp –sport 22 -j ACCEPT
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp -m tcp –dport 22 -j ACCEPT
となります。ルールを有効にするには「/etc/init.d/iptables restart」。
コマンドは実行した瞬間にルールが適用されるのでミスが起こりやすいので、その点スクリプトだと安全です。
最後に、iptablesはテスト環境を用意して実際にコマンドを試しながら勉強するのがいいと思います。自分もそうしましたが、習うより慣れろなところがあるので、そうすることをおすすめします。(ぶっつけ本番で失敗したら大変なことになっちゃいますしね)
以下、勉強の参考にさせていただいたサイトです。
http://linux.shoukun.com/security/iptables.htm
http://www.fmmc.or.jp/fm/nwts/rh_linux/ch6/6_2_1_4.html
http://kurosuke.net/linux/iptables.shtml
http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO-7.html
http://cyberam.dip.jp/linux_security/iptables.html
http://www.asahi-net.or.jp/~bk3k-andu/linux/tips/iptables4.html
http://www.d3.dion.ne.jp/~koetaka/router.html
※追記
/etc/sysconfig/iptablesはデフォルトでは存在しません。
# /etc/rc.d/init.d/iptables save
を実行すると保存されます。
特定のパッケージだけyumのアップデート対象から外す
/etc/yum.confの、[main]のセクションに
exclude=アップデートから外したいパッケージ名
とすればOK。
ワイルドカードも使える。
exclude=kernel*
カーネルを更新すると最悪起動しなくなってしまうというリスクもあるので、自分の環境ではこのように設定しています。
参考
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/596noupyum.html
yumでphp5,mysqlをインストール
centosplusとdagリポジトリの設定が終わったら、php5、mysqlのインストール、アップデートを始めます。
まずは現在のバージョンを確認。
# php -v
PHP 4.3.9 (cgi)
# mysql
入ってない
ではphpから
# yum update php
でOK。他にphp-mysqlとか、gdとか、使うモジュールも入れておきましょう。
続いてmysql
# yum install mysql
これで依存関係もまとめてインストールできます。なお、これだとインストールされるのはmysqlのクライアントだけで、サーバーがインストールされないので
# yum install mysql-server
もやっておきましょう。
以上で完了です。
centosplusとdagを導入
yumでmysqlとかphp5とかを入れる場合はリポジトリにcentosplusやdagを入れる必要があります。
# vi /etc/yum.repos.d/CentOS-Base.repo
まずはcentosplusの記述。
既に[centosplus]があるので、baseurlとenabledを以下のようにします。
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/centosplus/$basearch/
enabled=1
続いてdag。
これは新規で記述を追加します。
[dag]
name=Dag RPM Repository for RHEL4/CentOS4
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el4/en/$basearch/dag/
enabled=1
gpgcheck=1
そしてGPG-KEYを取得。
# rpm –import http://ftp.riken.jp/Linux/dag/packages/RPM-GPG-KEY.dag.txt
# rpm –import ftp://ftp.riken.jp/Linux/dag/RPM-GPG-KEY.dag.txt
パソコンおやじさんのページをそのまま使わせていただきました。