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標準のファイアウォールが有効になるように設定します。

  1. system-config-securitylevel => Enabled & Customize
  2. 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