HowTos/Scalixセキュリティ
出典: ScalixWikiJP
Scalix Wiki -> How-Tos -> HowTos/Scalixセキュリティ
このセクションは HowTos/ScalixSecurity(米国サイト)をもとに作成しています。
目次 |
はじめに
ここでは、Scalix サーバを安全にする方法について記述します。 記述した内容について、次の環境で動作を確認しました。
Scalix バージョン 11.1.0-GA CentOS release 4.4 (Final)
なお、ここでサンプルとして示しているホスト名は、mail.yourdomain.net であると仮定します。
システムとサービスの強化
ここでは、セキュリティ脆弱性の最小化について紹介します。 未使用のサービスを取り除いたり、重要な情報の漏洩を抑えることで、 セキュリティリスクを小さくすることができます。
Bastille-Linux のインストール
Bastille-Linux はセキュリティの強化に役立ちます。 インストールの前には、対応するOSについてサポートされているか、http://www.bastille-linux.org/running_bastille_on.htm を確認し、rpm ファイルをダウンロードしてください。
Bastille-Linux を rpm からインストールする:
# rpm -ihv Bastille-3.0.9-1.0.noarch.rpm
Bastille-Linux が利用する、perl-Curses をインストールする:
# yum install perl-Curses --enablerepo=dag
Bastille-Linux をテキストモードで起動する:
# bastille -c
質問には、注意して答えてください。
- Sendmail と Apache に制限をかけたり、無効にしないでください。
- 必要な Apache ドキュメントからのシンボリックリンクを無効にしないでください。ただし、シンボリックリンクがApacheドキュメントルートの外を示さない(# find /var/www/html/ -type l -exec ls -l {} \;)、にはチェックを入れてください。なぜなら、それはセキュリティリスクを引き起こす可能性があるからです。
- Bastille-Linux ファイアウォールの機能を使うか、単純にOSのファイアウォールを使うか("ファイアウォールのセットアップ" を参照してください)、どちらかを選んでください。
Bastille-Linux のログは、/var/log/Bastille にあります。設定内容などが記録されています。
SMTP グリーティングの変更
HowTos/SMTPグリーティングの変更を参照してください。
メモ:smtpd.cfg ファイルはリードオンリーです。次の手順で編集を行ってください:
# chmod u+w /var/opt/scalix/sys/smtpd.cfg # vi /var/opt/scalix/sys/smtpd.cfg => "EXTENSIONS=" と "GREETING=SMTPd" に変更します。 # chmod u-w /var/opt/scalix/sys/smtpd.cfg
重要事項:EXTENSIONS 行の変更には副作用があります。ここに記述された extensions は、SMTPリレーのEHLO コマンドでシステムに接続するための最初の応答として公開されます。例えば、AUTH extension を削除すると、クライアントの認証が行われない、などの場合があります。副作用について不確実な場合は、EXTENSIONS の行は変更せずに、GREETING の行だけを変更してください。
POP グリーティングの変更
標準のPOPセッション:
$ telnet mail.yourdomain.net 110 Trying 192.168.100.11... Connected to mail.yourdomain.net (192.168.100.11). Escape character is '^]'. +OK Scalix POP3 interface ready on: mail.yourdomain.net quit +OK POP3 Server connection terminated Connection closed by foreign host.
グリーティング行には、Scalix サーバであることが明示されてしまいます。しかし現在のところ、これを変更する方法はありません。
IMAP グリーティングの変更
標準のIMAPセッション:
$ telnet mail.yourdomain.net 143 Trying 192.168.100.11... Connected to mail.yourdomain.net (192.168.100.11). Escape character is '^]'. * OK Scalix IMAP server 10.0.1.3 ready on mail.yourdomain.net a1 logout * BYE Scalix IMAP Server logging out a1 OK LOGOUT completed Connection closed by foreign host.
グリーティング行とグッドバイ行に機密情報が表示されています。 これらは、general.cfg ファイル中のIMAP_GREETINGの設定で変更できます。 例えば、IMAP_GREETING=IMAPd を追加します。
general.cfg の変更が済んだら、IMAP デーモン再起動させます。
# omoff -d0 -w imap # omon imap
カスタマイズ後の IMAP セッションは次の通りです:
$ telnet mail.yourdomain.net 143 Trying 192.168.100.11... Connected to mail.yourdomain.net (192.168.100.11). Escape character is '^]'. * OK IMAPd a1 logout * BYE IMAP Server logging out a1 OK LOGOUT completed Connection closed by foreign host.
Apache 情報の変更
デフォルトのApacheの設定ではシステムの多くの情報が公開されます。 ここでは、公開される情報を最小にする方法について記述します。
- デフォルトページの変更
http://mail.yourdomain.net にアクセスすると、デフォルトページが表示されます。 これは、'Apache 2 Test Page powered by CentOS' と表示しています。 これをブランクのページに置き換えます。
- エラー/ヘッダ情報の変更
メールサーバの80番ポートに Telnet でアクセスし、ヘッダ情報を取得すると(HEAD/HTTP)、次のように表示されます。
$ telnet mail.yourdomain.net 80 Trying 192.168.100.11... Connected to mail.yourdomain.net (192.168.100.11). Escape character is '^]'. HEAD / HTTP
HTTP/1.1 200 OK Date: Tue, 29 Aug 2006 22:32:32 GMT Server: Apache/2.0.52 (CentOS) Last-Modified: Wed, 23 Aug 2006 22:09:41 GMT ETag: "44f1f-9bd-998d1340" Accept-Ranges: bytes Content-Length: 2493 Vary: Accept-Encoding Connection: close Content-Type: text/html; charset=UTF-8 Connection closed by foreign host.
上記の通り、Telnet セッションは機密情報を公開します。 これはhttpd.conf(CentOSの場合:/etc/httpd/conf/httpd.conf) ファイルの変更で行うことが>できます。
httpd.conf 中の ServerTokens を Prod に、ServerSignature を Off に設定します。
HTTPデーモンを再起動します:
# service httpd restart
カスタマイズ後、メールサーバに Telnet でアクセスすると次のようになります:
$ telnet mail.yourdomain.net 80 Trying 192.168.100.11... Connected to mail.yourdomain.net (192.168.100.11). Escape character is '^]'. HEAD / HTTP
HTTP/1.1 200 OK Date: Tue, 29 Aug 2006 23:04:44 GMT Server: Apache Last-Modified: Wed, 23 Aug 2006 22:09:41 GMT ETag: "44f1f-9bd-998d1340" Accept-Ranges: bytes Content-Length: 2493 Vary: Accept-Encoding Connection: close Content-Type: text/html; charset=UTF-8 Connection closed by foreign host.
Telnetセッションから、OS名とバージョン番号は消えました。しかし、製品名(Apache)はそのままです。製品名を削除するには、Apache のソースファイル httpd.h を変更し、コンパイル、Apache を再インストールする必要があります。ただし、これを行うと Apache セキュリティアップデートが行えなくなり、セキュリティリスクが高まります。
- Webmail と SAC ログインページからバージョン番号を削除してください。
Tomcat を root 以外のユーザで起動する
HowTos/Tomcatとの統合 を参照してください。 メモ:
1. Tomcat が root で起動しているか調べます。
# ps aux | grep tomcat
2. tomcat という名前のユーザとグループを作成します。
# useradd tomcat
3. Tomcat が root 以外のユーザで起動するように設定します。
# vi /etc/init.d/scalix-tomcat
=> startup と shutdown の行を次のように変更します:
startup="/bin/su tomcat -c $CATALINA_HOME/bin/startup.sh"
shutdown="/bin/su tomcat -c $CATALINA_HOME/bin/shutdown.sh"
# chown -R tomcat.tomcat /opt/scalix-tomcat/
# chmod go+r /etc/opt/scalix/caa/scalix.res/config/psdata
注意:米国サイトのwikiでは、startup="/bin/su - tomcat -c $CATALINA_HOME/bin/startup.sh" と記述されていますが、これでは Tomcat が起動されないようなので、- は外してください。
4. HowTos/Tomcatとの統合 のページの "Tomcat を root 以外のユーザで起動させる" の項目に記述してある内容を実行します。
5. Tomcat関連 のログファイル、pid出力ファイルなどの所有者を変更します。
# cd /var/opt/scalix/XX/tomcat/ (XX は、サーバごとに異なります) # chown tomcat.tomcat tomcat.pid # chown -R tomcat.tomcat logs
6. Tomcat を再起動します。
# service scalix-tomcat restart
7. Tomcat が ユーザ tomcat で起動していることを確認します。
# ps aux | grep tomcat
問題が発生した場合は、/var/opt/scalix/*/tomcat/logs にあるログファイルを解析してください。ログにさらに詳しい情報を記録したい場合は、/var/opt/scalix/*/caa/config/log4j.properties 中の、INFO を DEBUG に変更してください。
強制的に https を使用させる
ユーザが webmail や sac を使用する際に、http ではなく https を使用させることを強制します。 この方法ですと、インターネット上を通信する情報は暗号化されます。
/etc/opt/scalix-tomcat/connector/jk と、/etc/opt/scalix-tomcat/connector/ajp にある instance-<scalix-server-hostname>.conf の VirualHost セクションを、次のように書き換えます。
変更前:
<VirtualHost *:80> Include /etc/opt/scalix-tomcat/connector/<conn>/app-<scalix-server-hostname>.*.conf </VirtualHost>
変更後:
<VirtualHost *:80>
Include /etc/opt/scalix-tomcat/connector/<conn>/app-<scalix-server-hostname>.*.conf
<LocationMatch "^/sac/*">
RewriteEngine on
RewriteRule ^(.*) https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
</LocationMatch>
<LocationMatch "^/webmail/*">
RewriteEngine on
RewriteRule ^(.*) https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
</LocationMatch>
</VirtualHost>
注意:<conn> の部分は、適用するコネクタ名に、<scalix-server-hostname> の 部分は、Scalix サーバのホスト名に書き換えてください。
ファイルを変更したら、設定を有効にするため、httpd を再起動(またはリロード)してください。
stunnel の設定
Scalixサーバへの接続に、IMAPS、POPS、SMTPS を使用する場合は、stunnel を設定する必要があります。
1) /etc/stunnel/stunnel.conf をエディタで開き、次の設定を記述します。
[pop3s] accept = 995 connect = 110 [imaps] accept = 993 connect = 143 [ssmtp] accept = 465 connect = 25
この設定により、セキュアポートからノンセキュアポートへのリダイレクションが設定されます。
通常、ノンセキュアポートは、ファイアウォールによりブロックされています。 Scalix サーバがインターネットメールを受信するためには。25 番ポートもオープン しておく必要があります。
2) stunnel の証明書が正しいものであるか確認してください。/etc/stunnel/stunnel.conf に次の設定を記述してください。
cert = /etc/stunnel/stunnel.pem
新しい証明書を作成する場合は、openssl の Makefile を使用することができます。
cd /usr/share/ssl/certs make /etc/stunnel/stunnel.pem
入力要求される項目を、入力してください。ただし、Common Name にはホスト名を 入力してください。そうしないと、認証エラーが発生します。
stunnel がブート時に起動されるための、init.d スクリプトの例を次に示します。
#!/bin/bash
#
# stunnel This shell script takes care of starting and stopping
# stunnel
#
# chkconfig: 345 80 30
# description: Secure tunnel
# processname: stunnel
# config: /etc/stunnel/stunnel.conf
# pidfile: /var/run/stunnel/stunnel.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source stunnel configureation.
if [ -f /etc/sysconfig/stunnel ] ; then
. /etc/sysconfig/stunnel
fi
RETVAL=0
prog="stunnel"
start() {
# Start daemons.
echo -n $"Starting $prog: "
if test -x /usr/sbin/stunnel ; then
/usr/sbin/stunnel
fi
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/stunnel
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down $prog: "
killproc stunnel
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/stunnel
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
RETVAL=$?
;;
condrestart)
if [ -f /var/lock/subsys/stunnel ]; then
stop
start
RETVAL=$?
fi
;;
status)
status stunnel
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac
exit $RETVAL
SMTP での TLS
Q:Scalix は、IMAP、SMTP 接続でのSSL をサポートしますか?
A:Scalix は、独自の TLS を持っていません。しかし、stunnel を使って SSL を サポートすることができます。
-Scalix Knowledgebaseの記事#124269 に記述されています。
ファイアウォールの設定
利用できるサービス
ファイアウォールを設定する前に、システムのどのサービスが起動されて、 どのサービスを外部から利用可能にすべきかを決めなければなりません:
# netstat -npl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5729 0.0.0.0:* LISTEN 3010/advmail.sckd tcp 0 0 0.0.0.0:9090 0.0.0.0:* LISTEN 1652/httpd tcp 0 0 0.0.0.0:9092 0.0.0.0:* LISTEN 1627/python tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 3044/omslapd tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 1501/java tcp 0 0 127.0.0.1:8009 0.0.0.0:* LISTEN 1501/java tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1057/mysqld tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 3081/pop3.server tcp 0 0 127.0.0.1:3310 0.0.0.0:* LISTEN 966/clamd tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 3032/in.imap41d tcp 0 0 0.0.0.0:44975 0.0.0.0:* LISTEN 779/rpc.statd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 760/portmap tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN 1603/postmaster tcp 0 0 192.168.100.11:25 0.0.0.0:* LISTEN 3700/omsmtpd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1249/sendmail: acce tcp 0 0 :::80 :::* LISTEN 1479/httpd tcp 0 0 :::22 :::* LISTEN 944/sshd tcp 0 0 :::443 :::* LISTEN 1479/httpd udp 0 0 0.0.0.0:32768 0.0.0.0:* 779/rpc.statd udp 0 0 192.168.100.11:5766 0.0.0.0:* 3029/omnssck udp 0 0 127.0.0.1:5766 0.0.0.0:* 3029/omnssck udp 0 0 0.0.0.0:955 0.0.0.0:* 779/rpc.statd udp 0 0 0.0.0.0:111 0.0.0.0:* 760/portmap udp 0 0 0.0.0.0:3450 0.0.0.0:* 1501/java udp 0 0 0.0.0.0:5757 0.0.0.0:* 3022/omdrs Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node PID/Program name Path unix 2 [ ACC ] STREAM LISTENING 2506 1057/mysqld /var/lib/mysql/mysql.sock unix 2 [ ACC ] STREAM LISTENING 9728 3038/mime.control /var/opt/scalix/temp/mime_browse unix 2 [ ACC ] STREAM LISTENING 3718 1526/dbus-daemon-1 /var/run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 4245 1603/postmaster /tmp/.s.PGSQL.8081 unix 2 [ ACC ] STREAM LISTENING 13195 3702/omsmtpd /var/opt/scalix/temp/smtpd_socket unix 2 [ ACC ] STREAM LISTENING 9575 2979/omsessd /var/opt/scalix/temp/sessd_socket unix 2 [ ACC ] STREAM LISTENING 9626 2999/omlicmon /var/opt/scalix/temp/lic
ご覧の通り、たくさんのサービスをリッスンしています。ほとんどのサービスが 外部からアクセスされる必要のないものです。 不要なサービスはシャットダウンし、システムから削除してください。 もしくは、ファイアウォールでブロックしてください。
必要なサービスは、22 (ssh)、25 (smtp)、80 (http)、443 (https)、5729 (scalixual) のポートです。 ファイアウォールの設定方法については、次の2つの章を参照してください。
OS標準のファイアウォールを使用する
このファイアウォールは、Scalix が機能するために開いておくべきポートを 知っていれば、簡単に設定することができます。 Bastille-Linux ファイアウォールではなく、OS標準のファイアウォールを 使用する場合は、ブート時の Bastille-Linux の起動を無効にし、 OS標準のファイアウォールの起動が有効になるように設定します。
まず、Bastille-Linux ファイアウォールが起動されている場合は シャットダウンし、完全に無効にします。
# vi /etc/Bastille/config => PSAD.psad_config="N", Firewall.ip_enable_firewall="N" & Firewall.ip_intro="N" # bastille -b # service psad stop # service bastille-firewall stop # chkconfig psad off # chkconfig bastille-firewall off # chmod 0600 /etc/init.d/psad # chmod 0600 /etc/init.d/bastille-firewall
このスクリプトで示す通り、Bastille-Linux ファイアウォールをシャットダウン させるのは簡単ではありません。
次に、OS標準のファイアウォールが有効になるように設定します。
- system-config-securitylevel => Enabled & Customize
- chkconfig --level 2345 iptables on
iptables のルールを表示させます。(指定したポートがACCEPT になっているかチェックします)
iptables -L ... ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:https ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:scalixual ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:smtp ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http ...
Bastille-Linux ファイアウォールを利用する
これは高度なファイアウォールです。これを設定するためには、 プロトコル、ポート番号、インタフェース、psadソフトウェアに関する 知識が必要になります。 Bastille-Linux を使用する場合は、 ブート時の OS標準のファイアウォールの起動を無効にし、 Bastille-Linux の起動が有効になるように設定します。
OS標準のファイアウォールを無効にする:
# system-config-securitylevel => Disabled # chkconfig iptables off
Bastille-Linux ファイアウォールを有効にする("システムとサービスの強化" の章で有効に設定されているはずです)
# service bastille-firewall start
このファイアウォールは、独自の設定ファイル (/etc/Bastille/bastille-firewall.cfg) をもっています。しかし、このファイルの編集は、グローバルなBastille-Linux設定 ファイル(/etc/Bastille/config)で実行できなかった場合のみ行ってください。
この方法により、後でBastille-Linuxを起動したときに、設定した ファイアウォールルール削除してしまうことを避けることができます。
グローバルな Bastille-Linux 設定ファイルは次のコマンドで実行することが できます。
# bastille -b
Bastille-Linux は他にも、ポートスキャンアタックディテクタ psad と連携できる機能があります。 psad のインストールは次のように行います:
$ wget http://www.cipherdyne.com/psad/download/psad-1.4.6-1.i386.rpm # rpm -ivh psad-1.4.6-1.i386.rpm # cp -a /etc/psad/psad.conf /etc/psad/psad.conf.orig # vi /etc/psad/psad.conf => you have to change the HOME_NET variable # service psad start
psad の設定は難しく、適切な設定方法を見つけるには手間がかかるかも しれません。
セキュリティを維持する
システムのアップデート
システムの設定を完了し、セキュリティの設定も完了すると、それを維持する ことが必要になります。 セキュリティパッチや、アップデートが提供されたらすぐに適用してください。
いくつかのソフトウェアは次のコマンドによりアップデートできます。
# yum -y update
次の設定により自動的にアップデートを行うことができます。
# chkconfig yum on && service yum start
ただし、自動的にアップデートを行うと、システムがダウンする場合があります。 最もよい回避策は、システムレポジトリ以外から インストールしたパッケージのリストを保持し、 これらのパッケージをアップデートしたかをチェックする スクリプトを起動させることです。
Tripwire と Chkrootkit のインストール
Tripwire は、システムにある重要なファイルを監視するための ベースラインデータベースを作成し、定期的にファイルとデータベースを比較し ファイルの修正や削除があるかを監視します。 セットアップ方法については次のページを参照してください。 http://lists.centos.org/pipermail/centos/2006-June/066071.html.
ファイルが変更されていることを確認した後、 ベースラインデータベースを更新します。(更新/構成変更):
1. ファイルの変更がたくさんあった場合、次のコマンドで更新します:
# tripwire --update
警告:日々のtripwireからのメールを受信した後、 無条件にこのコマンドを使用しないでください。 メールを受信している間にも、許可されない変更が 発生している可能性があるためです。 まずはTripwireのチェックをおこなってから更新を行ってください。
2. いくつかの変更があったら、tripwire の対話モードで 変更を許可してください。
# tripwire --check --interactive
Chkrootkit は定期的にシステムの rootkit のインストールを 検査するツールです。
chkrootkit のインストール (dag repo を利用可能にしてください):
# yum install chkrootkit --enablerepo=dag
メモ:stunnel を利用している場合、次のようなエントリが chkrootkit の出力に表示されます。
Checking `bindshell'... INFECTED (PORTS: 465) Checking `sniffer'... /proc/89/fd: Permission denied eth0: not promisc and no PF_PACKET sockets
どのプロセスが tcp 465 ポートを使用しているかを特定したい 場合は、fuser コマンドを使用できます。
# fuser -vn tcp 465
USER PID ACCESS COMMAND
465/tcp root 3891 f.... stunnel
ClamAV のインストール
ClamAV のインストール (dag repo を利用可能にしてください):
# yum install clamd clamav clamav-db --enablerepo=dag
メモ:kbsingh repo からの clamav パッケージを使用しないでください。 セットアップが難しいためです。
デーモンを開始する:
# service clamd start
定義ファイルを更新する:
# freshclam
