Ubuntu 12.04 LTSサーバーを安全にする
この記事は、The Fan Clubというサイトの"How to secure an Ubuntu 12.04 LTS server - Part 1 The Basics"という記事を著者のChristiaan Diedericksさんの許可を得て、翻訳したものです。
私はUbuntuデスクトップのユーザではありませんが、VagrantやDigital Oceanのドロップレットで、Ubuntu サーバー版を使用することがあり、この記事を見つけました。まとまっているようなので、少しずつ翻訳しながら、紹介していきます。
この記事にはPart2があります。そこでは、ここで紹介している内容をデスクトップのGUIから設定できるツールが紹介されています。しかし、デスクトップ環境のインストールが必要なため、利用は限られるでしょう。Zenityではなくdialogを使えば、より使用の幅が広がるでしょう。ちょっと残念です。(許可をもらうついでに、著者に進言してみたら、dialogバージョンも作りかけているが、忙しいから中断しているのだそうです。)
このガイドは様々なコミュニティーフォーラムの投稿記事やWebサイトの情報を元に作成されました。皆さん、ありがとうございました。現時点では、個人的な経験を元にしていますので、もっと考慮を重ねる必要があり、コメントや更に良い情報を歓迎いたします。
このガイドは、以下の内容を一段ずつ学ぶことを目標としています。
以降をインストール・設定することにより、Ubuntu 12.04 LSTサーバーのセキュリティーを強化する。
- ファイヤーウォールのインストールと設定:ufw
- 安全な共有メモリー:fstab
- SSH:ルートログインの禁止とポート変更
- adminグループにアクセスを限定することによる、suの保護
- sysctl設定によるネットワークの強化
- DNS再帰検索禁止とバージョン情報の削除:Bind9 DNS再帰検索禁止とバージョン情報の削除
- IPなりすましの防止
- PHPセキュリティーの強化
- Apache情報漏れの制限
- Apacheアプリケーションファイヤーウォールのインストールと設定:ModSecurity
- ModEvasiveによるDDOS攻撃の防止
- ログのスキャンと疑わしいホストのban:DenyHostsとFail2Ban
- 侵入探知:PSAD
- Rootkitsの確認:RKHunterとCHKRootKit
- オープンポートのスキャン:Nmap
- システムログファイルの解析:LogWatch
- SELinux:Apparmor
- システムセキュリティーの監視:Tiger
ここで説明する全ステップをインストールし設定するGUIを探しているのでしたら、How to secure an Ubuntu 12.04 LTS server - Part 2 The GUI Installer scriptをご覧ください。
動作要件:
- 標準的なLAMPがインストールされたUbuntu 12.04 LTS サーバー
1.ファイヤーウォール:ufw
最初に行うべきは、ファイヤーウォールのインストールです。
UFW - Uncomplicated Firewall(難しくないファイヤーウォール)はよく出来ている基本的なファイヤーウォールで、gufwやShorewall、fwbuilder、Firestarterなどのツールにより、簡単に設定できます。
Firestarter GUIで設定するか、もしくはUbuntサーバーガイドのUFWマニュアルか、Ubuntu UFWコミュニティーのドキュメントを参照してください。
UFWをインストールするには、端末を開き、次のコマンドを実行してください。
sudo apt-get install ufw
SSHとHttpサービスを許可する
sudo ufw allow ssh sudo ufw allow http
ファイヤーウォールを有効にする
sudo ufw enable
ファイヤーウォールの設定状態を確認する
sudo ufw status verbose
2.安全な共有メモリ
共有メモリは、実行中のサービスに対する攻撃に使用できます。/etc/fstabを強化しましょう。
端末ウィンドウを開き、以下のコマンドを実行してください。
sudo vi /etc/fstab
以下の行を追加し、保存します。この設定を有効にするためには、リブートする必要があります。
注意:これはUbuntu 12.04でのみ有効です。より最新のバージョンのUtuntuサーバーでは/dev/shmを/run/shmに変更してください。
保存したら、リブートしてください。
tmpfs /dev/shm tmpfs defaults,noexec,nosuid 0 0
3.SSH強化 - ルートログインの禁止とポート変更
SSHを安全にする一番簡単な方法は、ルートログインを禁止し、SSHポートを標準的な22番ポートから、何か他のポートへ変更するです。
ルートログインを禁止する前に、新しいSSHユーザを作成し、そのユーザーがadminグループへ所属していることを確認してください。(adminグループに関連している、下の4番目のステップを見てください。)
SSHポートを変更したら、あなたの選んだ新しいポートをファイヤーポートで開き、22ポートを閉じなくてはなりません。
端末ウィンドウで、以下を実行してください。
sudo vi /etc/ssh/sshd_config
変更、もしくは以下を追加してください。
Port <選んだポート番号> Protocol 2 PermitRootLogin no DebianBanner no
SSHサーバーを再起動し、端末ウィンドウを開き、実行してください。
sudo /etc/init.d/ssh restart
adminグループだけに限定することで、suを保護する
adminのユーザーだけにsuの使用を制限するためには、adminグループを作成し、ユーザを追加し、suの使用をadminグループだけに限定します。
adminグループをシステムに追加し、皆さん自身のadminユーザ名をグループに追加するために以下の<あなたの管理者ユーザ名>を置き換えてください。
端末ウィンドウを開き、入力してください。
sudo groupadd admin sudo usermod -a -G admin <あなたの管理者ユーザ名> sudo dpkg-statoverride --update --add root admin 4750 /bin/su
5.sysctl設定によるネットワークの強化
/etc/sysctl.confファイルは、全sysctl設定を保存しています。
やってきたパケットのソースルーティングと、偽装されたIPをログするため、以下を端末ウィンドウで実行します。
sudo vi /etc/sysctl.conf
/etc/sysctl.confファイルを編集し、以下の行のコメントを外すか、追加してください。
# IP偽装保護 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # ICMPブロードキャストリクエストを無視 net.ipv4.icmp_echo_ignore_broadcasts = 1 # ソースパケットルーティング禁止 net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv6.conf.default.accept_source_route = 0 # リダイレクト送信を無視 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # SYN攻撃をブロック net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 5 # Martiansのログ net.ipv4.conf.all.log_martians = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 # ICMPリダイレクトを無視 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 # 直接のpingを無視 net.ipv4.icmp_echo_ignore_all = 1
変更をsysyctlへリロードするには:
sudo sysctl -p
6.DNS再帰検索禁止とバージョン情報の削除:Bind9
端末を開き、以下を実行してください:
sudo vi /etc/bind/named.conf.options
以下をオプションセクションに追加してください。
recursion no; version "Not Disclosed";
BIND DNSサーバーを再起動します。端末を開き、以下を実行します。
sudo /etc/init.d/bind9 restart
7.IPなりすましの防止
端末を開き、以下を実行します。
sudo vi /etc/host.conf
以下の行を追加もしくは編集します。
order bind,hosts nospoof on
8.PHPセキュリティーの強化
php.iniファイルを編集しましょう。
sudo vi /etc/php5/apache2/php.ini
以下の行を編集もしくは追加し、保存してください。
disable_functions = exec,system,shell_exec,passthru register_globals = Off expose_php = Off display_errors = Off track_errors = Off html_errors = Off magic_quotes_gpc = Off
Apacheサーバーを再起動します。端末を開き、以下を実行してください。
sudo /etc/init.d/apache2 restart
9.Apache情報漏れの制限
Apache2設定セキュリティーファイルを編集します。
sudo vi /etc/apache2/conf.d/security
以下の行を編集、もしくは追加し、保存します。
ServerTokens Prod ServerSignature Off TraceEnable Off Header unset ETag FileETag None
Apacheサーバーを再起動する。端末を開き、以下を実行します。
sudo /etc/init.d/apache2 restart
10. Apacheアプリケーションファイヤーウォールのインストールと設定:ModSecurity
11. ModEvasiveによるDDOS攻撃の防止
12. ログのスキャンと疑わしいホストのban:DenyHostsとFail2Ban
DenyHostはPythonプログラムで、/etc/hosts.denyに追加することで、SSH攻撃を自動的に防ぎます。DenyHostsは、Linux管理者に攻撃ホストと、攻撃ユーザー、疑わしいログインも知らせてくれます。
端末を開き、以下を実行してください。
sudo apt-get install denyhosts
インストール後、/etc/denyhosts.conf設定ファイルを開き、メールと他の設定を必要に応じ編集してください。
管理者メール設定を編集するには、端末ウィンドウを開き、以下のコマンドを実行します。
sudo vi /etc/denyhosts.conf
以下の値をサーバーに合わせて変更してください。
ADMIN_EMAIL = root@localhost SMTP_HOST = localhost SMTP_PORT = 25 #SMTP_USERNAME=foo #SMTP_PASSWORD=bar SMTP_FROM = DenyHosts nobody@localhost #SYSLOG_REPORT=YES
Fail2banはDenyHostsよりも進んでおり、SSH、Apache、Courier、FTPなど他のサービスのログ監視を拡張します。
Fail2banはログファイルをスキャンし、悪意のある兆候を示すIPをbanします。パスワード不一致が多すぎたり、悪用できそうなところを探したりした場合です。
通常、Fail2Banは指定した時間の間、IPアドレスを拒絶するために、ファイヤーウォールのルールを更新しますが、どんな属性の他のアクションも設定できます。
Fail2Banには最初から、数多くのサービス(apache、courier、ftp、sshなど)に対するフィルターが備わっています。
ターミナルを開き、以下を実行してください。
sudo apt-get install fail2ban
インストール後、/etc/fail2ban/jail.local設定ファイルを編集し、必要なフィルタールールを作成してください。
端末ウィンドウを開き、以下のコマンドで編集します。
sudo vi /etc/fail2ban/jail.conf
Fail2Banによる各モニタリングサービスを有効にするには、enabled = false
をenabled=true
に変更してください。
例えば、SSHモニタリングを有効にし、牢屋に閉じ込めるには、以下の行を見つけ、falseをtrueに変更します。それだけです。
[ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3
ステップ3でデフォルトでないSSHポートを設定している場合、Fail2Banのポート設定も変更する必要があります。デフォルトの22ポートを、あなたの新しい番号へ変更します。例えば、1234ポートでしたら、port = 1234
です。
[ssh] enabled = true port = <あなたの設定したポート番号を指定してください> filter = sshd logpath = /var/log/auth.log maxretry = 3
Banするホストが変更されるときに、Fail2Banからメールを受け取りたい場合は、以下の行のメールアドレスを変更します。
destemail = root@localhost
続いて、以下の行を:
action = %(action_)s
次のように変更します。
action = %(action_mwl)s
デフォルトでないモニターをFail2Banへ指定したければ、様々なサービスに対して、ルールフィルターを作成することも可能です。
sudo vi /etc/fail2ban/jail.local
Fail2Banをどう設定するかと、様々なフィルターの作成方法は、HowtoForgeのこちらの例が、良いインストラクションになるでしょう。
Fail2Banの設定が済んだら、サービスをリスタートします。
sudo /etc/init.d/fail2ban restart
状態をチェックするには:
sudo fail2ban-client status
13.侵入探知:PSAD
Cipherdyne PSADは、Linuxマシン上で動作する3つの軽量システムデーモンで、ポートスキャンや、他の疑わしいトラフィックを見つけ出すため、iptablesログメッセージを解析します。
現在のバージョン2.1はUbuntu12.04でインストール中にエラーを起こしてしまいまが、見かけ上は動作しているように見えます。バージョン2.2では、これらの問題が解決されているのですが、Ubuntuのソフトウェアリポジトリーには、まだありません。CiperdyneのWebサイトからバージョン2.2のソースファイルを入手し、自分でコンパイルし、インストールすることをお勧めします。
インストラクションに従い、ソースファイルから最新バージョンをインストールする方法は、How to install PSAD Intrusion Detection on Ubuntu 12.04 LTS serverをご覧ください。
もしくは、Ubuntuソフトウェアリポジトリーから古いバージョンをインストールする場合は、端末を開き、以下を実行してください。
sudo apt-get install psad
インストール後、基本的な設定を行うには、How to install PSAD Intrusion Detection on Ubuntu 12.04 LTS serverのステップ2以降に従ってください。
14.Rootkitsの確認:RKHunterとCHKRootKit
RKHunterとCHKRootkitは、基本的に同じ働きを行い、システムのルートキットを確認します。両方を一緒に使用しても、悪影響はありません。
端末を開き、以下を実行してください。
sudo apt-get install rkhunter chkrootkit
chkrootkitを実行するには、以下を実行します。
sudo chkrootkit
RKHunterを更新し、実行するには、端末から以下を実行します。
sudo rkhunter --update sudo rkhunter --propupd sudo rkhunter --check
15.オープンポートのスキャン:Nmap
Nmap("Network Mapper")は、ネットワーク発見とセキュリティ追加のための、オープンソースで無料で使用できるユーティリティーです。
端末を開き、以下を実行してください。
sudo apt-get install nmap
ポートが開いているシステムをスキャンするためには:
nmap -v -sT localhost
SYN接続スキャンは:
sudo nmap -v -sS localhost
16. システムログファイルの解析:LogWatch
Logwatchはカスタマイズ可能なログ分析システムです。Logwatchはシステムのログ全体をパースし、指定した領域の分析レポートを生成します。Logwatchはほとんどのシステムで初めから動きますので、使用も簡単です。
端末を開き、以下を実行してください。
sudo apt-get install logwatch libdate-manip-perl
Logwatchの出力を読むには、lessを使用します。
sudo logwatch | less
過去7日分のLogwatchレポートをメールで受け取るには、以下のmail@domain.comを受け取りたいメールアドレスに置き換えてください。
sudo logwatch --mailto mail@domain.com --output mail --format html --range 'between -7 days and today'
17.SELinux:Apparmor
National Security Agency(NSA)はLinuxへSecurity-Enhanced Linux(SELinux)を導入することにより、次のレベルへと引き上げました。SELinuxは既存のGNU/Linuxにより使用され、カーネルを拡張し、ユーザー空間を防弾にしてくれます。
より詳細は、Ubuntu Server Guide - Apparmorをご覧ください。
Ubuntu 7.04からデフォルトでインストールされています。
端末を開き、以下を入力してください。
sudo apt-get install apparmor apparmor-profiles
実行されているか確認するには:
sudo apparmor_status
18.システムセキュリティーの監視:Tiger
Tigerは、セキュリティーの監視とシステム侵入検出の両方に使用できるツールです。
端末を開き、以下を実行して下さい。
sudo apt-get install tiger
Tigerを実行するには:
sudo tiger
Tigerの出力は/var/log/tigerにあり、セキュリティーレポートを見るには、端末で以降を実行してください。
sudo less /var/log/tiger/security.report.*