はじめに
Unix や Linux システムを含むコンピューティング環境全体で安全な設定を実装することは、攻撃対象領域(attack surface area)を減らし、サイバー攻撃がもたらし得る被害を制限できるため、重要なセキュリティのベストプラクティスです。実際、システムのハードニングは、多くのコンプライアンス指令における中核となる統制(core control)です。
このガイドでは、構成ハードニング(configuration hardening)が何であるか、また Linux および Unix システムに対してハードニング済みのビルド基準(hardened build standards)をどのように確立するかを説明します。
システムハードニングの基礎
最も安全な Linux サーバやその他のコンピューターは、電源が切断されておりネットワークから切り離されているものです。とはいえ、その機器を実際に IT サービスを提供するために使うのであれば、起動してネットワーク、さらにはインターネットに接続されたときに、セキュリティ対策を最大限に高める必要があります。
ここでハードニングが役立ちます。システムのハードニングとは、安全な運用とデータ保護のために、その構成を最適化することです。悪用可能な脆弱性の範囲は非常に広いため、従うべき主なルールは3つあります:
- コンピューターの役割に必要のない機能は削除してください。 たとえば、オペレーティング システムやその他のアプリケーションは、通常「クイック スタート(quick start)」状態で提供されます。そこには、ユーザーが望む可能性のあるユーティリティや機能があらかじめ読み込まれている場合があります。 しかし、提供される機能が多いほど、ホストが提示する攻撃対象領域(attack surface)は大きくなります。したがって、不要な機能は必ず無効にし、可能な限り不必要な機能の追加は避けてください。
- パッチとアップデートを速やかに適用してください。 ソフトウェア設計の欠陥は、攻撃者が悪用できる脆弱性を生み出します。ソフトウェア ベンダーは、これらの問題を解消するためにパッチまたは更新版ソフトウェアを提供します。したがって、オペレーティング システムを含むすべてのソフトウェアが常に完全に最新の状態になっていることを確認してください。
- 安全な構成設定を維持してください。 安全な設定が有効化され、維持されていることが非常に重要です。
Linux システム ハードニング
当然のことながら、Linux のセキュリティ ハードニングは、それ自体が専門的な手順です。理由は、微妙に異なる多種多様な Linux ディストリビューションが存在するためです。Linux サーバー ハードニングのベスト プラクティスに関するガイド、チェックリスト、ヒントは決して不足していません。たとえば Center for Internet Security (CIS) ベンチマークや DISA STIGs などがあります。しかし、このガイドでは採用すべき主要な設定オプションを提示します。
重要: 強化設定を適用する前に必ずシステムをバックアップし、再起動後に動作確認(テスト)を行ってください。ロックアウトされてしまうのは簡単です!
不要な機能を削除する
まず、サーバーの稼働に必要のない機能、ユーティリティ、サービスをすべて取り除きます。不要なソフトウェアはアンインストールし、必要のないシステムサービスは無効化してください。インフラ内のハードウェアにも悪用可能な脆弱性があるため、USB ポートなどのアクセス可能なインターフェイスは無効にするか、場合によっては物理的に端末から取り外してください。
ここでの手順は、ログインしてインストール済みのパッケージとサービスのレポートを取得し、それを確認して削除または無効化できるものを特定することです。残す必要のある重要な項目については、既知の脆弱性を悪用(エクスプロイト)されないように是正するための利用可能なパッチがあるか確認してください。
Linux/Unix システムでソフトウェアを一覧表示する方法
システム | 使用するコマンド |
|---|---|
|
Linux (例: RedHat または CentOS) |
rpm -qa --qf '%{NAME} %{VERSION} %{VENDOR}\\n' |
|
Debian Linux (例: Ubuntu) |
dpkg -l |
|
Fedora Linux |
|
|
ターミナルまたはプティセッションからソフトウェアをリストするには: service --status-all chkconfig --list systemctl -a |
|
|
サービスを停止するには: Service <Service-Name> stop Chkconfig <Service-Name> Systemctl stop <Service-Name> |
|
|
サービスを無効にするには: Systemctl disable <Service-Name> Chkconfig <Service-Name> off |
|
|
また、/etc/init.d/パスを確認してサービス制御スクリプトを確認し、ls /etc/init.d/を実行してすべての起動スクリプトを表示します。その後、無効にするスクリプトを名前変更または削除します。 |
開放ポートおよびその他のネットワーク脆弱性を最小化する
ネットワークベースの攻撃は、最も一般的な脅威の1つです。リスクを下げるには、ネットワーク経由でアクセス可能なオープンポートを特定し、不要な場合はそれに対応するプロセスを削除してください。Linux でオープンポートを一覧表示するには、次のコマンドを使用します:
ss -tulpn | egrep “LISTEN” | awk ‘{print “IP-Port “ $4 “ PID/Name “ $7}’
加えて:
- TCP Wrappers サービスが有効になっていることを確認してください。
- 次の両方を定義します。etc/hosts.allow のホワイトリストと etc/hosts.deny のブラックリスト。
- iptables または Firewalld サービスに対して、IP V4 と V6 の両方のトラフィックについて Deny All(すべて拒否)ポリシーを適用してください。ネットワーク上でサードパーティの WAF やファイアウォール保護を使用している場合でも同様です。
- ICMP トラフィックをブロックして、ハッカーのツールが機器の発見に使用する ping スキャンを阻止してください。
ユーザーアカウントと認証の見直し
ローカルのユーザーアカウントを見直し、不要なものは削除してください。残すローカルのユーザーアカウントについては、パスワードの複雑さ、長さ、有効期限、再利用、変更頻度をカバーする強力なパスワードポリシーを設定する必要があります。さらに、保存するパスワードには強力なハッシュアルゴリズムを使用してください。
ユーザーアカウントと認証は、Active Directory のような集中管理の制御システムを使って統制するべきです。さらに、より良い選択として、Zero Standing Privilege 戦略を可能にする現代的な privileged access management (PAM) ソリューションを導入してください。これは、従来のユーザーアカウントと恒常的に割り当てられた特権に伴う多くの問題を打ち消します。もちろん、root は決して使用せず、sudo の昇格は必要なときだけ行うように常に確認してください。
ローカル アカウントのパスワード ポリシーを設定する方法
次の設定ファイルを見つけて編集します。 /etc/security/pwquality.conf
14 文字のパスワードを適用するには:
minlen = 14
すべてのパスワードに複雑性を適用するには:
minclass = 14
または
dcredit = -1
ucredit = -1
ocredit = -1
lcredit = -1
強力なパスワードのロックアウト ポリシーを適用するには:
次のオプションを設定するために、/etc/pam.d/system-auth および /etc/pam.d/password-auth ファイルを更新します:
auth required pam_faillock.so preauth silent deny=5 unlock_time=900
auth required pam_faillock.so authfail deny=5 unlock_time=900
パスワード履歴ポリシーを 5 個以上に適用するには:
/etc/pam.d/password-auth の pam_pwhistory.so および pam_unix.so の行に remember=5 オプションを追加します:
password requisite pam_pwhistory.so try_first_pass local_users_only enforce-for-root retry=3 remember=5
password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok remember=5
強力なパスワード ハッシュを適用するには:
次のとおり /etc/pam.d/system-auth と /etc/pam.d/password-auth ファイルを更新します:
/etc/pam.d/password-auth:
password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok
/etc/pam.d/system-auth:
password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok remember=5
サービスアカウントの確認
システムアカウントおよびサービスアカウントは確認し、不要になったものは削除してください。
サービスアカウントは、ローカルで実行されるプロセスの動作のみをサポートし、ユーザー用のシェルを提供しないように「強化(hardened)」されているため、これらのアカウントはユーザーのログオンによってサーバーにアクセスするために使用することは決してできません。とはいえ、強化の基本的なスローガンは機能を最小化することなので、未使用のサービスアカウントは引き続き削除する必要があります。
Linux および Unix 向け SSH の強化
Linux システムをリモートで管理するための主要な手段である SSH には、特に注意が必要です。SSH サーバーの動作を強化するには、設定ファイル内の複数のデフォルト設定を有効にする必要があります。/etc/ssh/sshd_config のファイルにある項目を有効化してください。
SSH は Linux および Unix へのアクセスすべてで使用されるため、以下のガイドラインは Unix の強化にも適用されます。
SSH プロトコルの v2 を有効にする
たとえば、デフォルト設定では、古くて安全性が低い SSH プロトコルのバージョン 1 が有効になっています。CIS のハードニングガイダンスでは、セキュリティを強化するためにバージョン 2 を有効にすることを推奨しています。これを行うには、構成ファイル(/etc/ssh/sshd_config)内の Protocol 2 設定について、# を削除して(# を外して)次のようにコメントを解除するだけです:
/etc/ssh/sshd_config のデフォルト項目 /etc/ssh/sshd_config:
# The default requires explicit activation of protocol 1
# Protocol 2
より安全な設定:
# The default requires explicit activation of protocol 1
Protocol 2
追加のハードニング
さらに、次の推奨される CIS のハードニング設定を構成ファイルに適用してください:
LogLevel INFO
IgnoreRhosts yes
…
PermitEmptyPasswords no
…
LoginGraceTime 60
PermitRootLogin no
MaxAuthTries 4
HostbasedAuthentication no
…
X11Forwarding no…
PermitUserEnvironment no
…
ClientAliveInterval 300
ClientAliveCountMax 0
…
Banner /etc/issue.net
…
AllowUsers <Specify user names, separated by spaces, e.g. user1 user2>
追加の注記:
/etc/issue.net には、適切なバナーを含めるために作成/編集が必要です。例:
警告! 本システムへの無断アクセスは禁止されており、法により処罰されます。本システムにアクセスすることで、無許可の使用が疑われる場合に、あなたの行動が監視される可能性があることに同意したものとみなされます。
次とともに AllowUsers, AllowGroups は、構成スイッチ/キーワードとしてもサポートされています。
Apache Web サーバーの強化
Linuxは、インターネットベースのWebアプリケーションをホスティングするための代表的なプラットフォームであり、Apache Tomcat と Apache HTTP Server(多くの場合 Apache HTTPD と呼ばれます)は、Webコンテンツを配信するための人気の高い選択肢の2つです。
Apache の設定強化(ハードニング)における方針も同じです。可能な限り機能を最小化し、利用可能な場合は安全な設定を実装してください。
必須の Apache モジュールのみが有効になっていることを確認してください:
httpd -M
例えば、mod_dav と mod_dav_fs は常に無効にしておくべきですが、log_config モジュールは常に読み込まれ、有効化されている必要があります。
package.access の定義に、以下の許可されたパッケージのみが含まれていることを確認してください:
package.access = sun.,org.apache.catalina.,org.apache.coyote.,
org.apache.tomcat.,org.apache.jasper.
server.xml ファイルを設定します:
server.xml ファイルは、CATALINA_HOME/conf 配下のパスにある Web サーバーの中核となる設定格納先です。 server.xml に含めることを推奨する設定は次のとおりです:
- シャットダウン ポートを無効にします:
Server port="-1" shutdown="SHUTDOWN">
- 使用しないコネクタを削除します。デフォルトの HTTPConnector および AJPConnector も含めます。HTTPConnector を削除するには、このタグを削除するかコメントアウトしてください:
Connector className="org.apache.catalina.connector.http.HttpConnector"
...
connectionTimeout="60000"/>
デフォルトの presence-advertising 設定を削除します:
Tomcat の場合:
xpoweredBy 属性を false に設定します:
xpoweredBy="false" />
HTTP Server の場合:
- デフォルトの index.html を削除し、以下を /etc/httpd/conf.d/welcome.conf から、各行ごとに # または ## を使ってコメントアウトします:
##<LocationMatch "^/+$">
## Options -Indexes
## ErrorDocument 403 /error/noindex.html
##</LocationMatch>
- Server-Status セクションをコメントアウトします:
##<Location /server-status>
## SetHandler server-status
## Order deny,allow
## Deny from all
## Allow from .example.com
##</Location>
- server-info セクションをコメントアウトします:
##<Location /server-info>
## SetHandler server-info
## Order deny,allow
## Deny from all
## Allow from .example.com
##</Location>
診断トレース機能を無効化します:
各 allowTrace 属性を Connector ごとに false
アプリケーションの自動デプロイを無効にし、起動時のデプロイも無効にします:
autoDeploy="false"
deployOnStartup="false"
追加のハードニング:
- ファイルおよびフォルダーの権限が厳格に設定されていること、また Apache サービスが非シェルのサービスアカウント(つまり、システムへのログオンに使用できないアカウント)を使って実行されることを確認してください。ディレクトリの一覧表示と閲覧を無効にします。
$CATALINA_HOME
$CATALINA_BASE
Linux 向けカーネル強化(ハードニング)
SELinux は Linux カーネルを変更して強制アクセス制御(MAC)を適用し、Linux のプロセスがファイルやプログラムにアクセスできる方法を制限します。この追加の制限レイヤーにより、root kit マルウェアに対する基本的な防護メカニズムが提供されます。AppArmor は Debian ディストリビューション向けに同等レベルの MAC を提供します。
SELinux の設定
CentOS/RHEL に SELinux をインストールします:
dnf install libselinux
SELinux を有効にします:
デフォルトでは SELinux は無効になっています。起動時に SELinux を有効にするには edit/etc/default/grub これらのデフォルト設定を削除します:
selinux=0
enforcing=0
SELinux 設定を enforcing に設定する
次の内容を含めるために /etc/selinux/config ファイルを編集してください:
SELINUX=enforcing
SELINUXTYPE=default
すべてのサービスが SELinux により制御されるセキュリティコンテキストで実行されていることを確認してください:
次のコマンドは、init プロセスから起動されるサービスを一覧表示します。これらのサービスには、デフォルト以外のセキュリティコンテキストが割り当てられている必要がある場合があります:
ps -eZ | egrep "initrc" | egrep -vw "tr|ps|egrep|bash|awk" | tr ':' ' ' | awk '{ print $NF }'
すべての設定が読み込まれたことを確認するために、コンピューターを再起動してください。
AppArmor の設定
Ubuntu/Debianに AppArmor をインストールします:
apt-get install apparmor apparmor-profiles apparmor-utils
起動時に AppArmor を有効化します:
次のファイルを編集:/etc/default/grub そして、以下の設定を追加します:
GRUB_CMDLINE_LINUX="apparmor=1 security=apparmor"
すべての AppArmor プロファイルが enforce モードになっていることを確認します:
aa-enforce /etc/apparmor.d/*
組み込みLinuxの強化
組み込み Linux(Embedded Linux)は、スマートフォン、スマートテレビ、セットトップボックス、ブロードバンド・インターネット・ルーターなどの組み込みデバイスや組み込みシステム向けに、簡素化されたオペレーティングシステムを提供します。
設置面積(フットプリント)が小さく、機能が簡素化されたオペレーティングシステムは、サーバーグレードの Linux デバイスで通常提供される機能をすべて必要としない場合や、製造コストを抑えるためにストレージ、メモリ、CPU などのハードウェアリソースが最小化されている場合に適しています。たとえば、Google が開発したオープンソースの Android プラットフォームはスマートフォンやテレビ向けに最適化されており、OpenWrt のルーター用ファームウェアは幅広いブロードバンド・ルーターで使用されています。
オペレーティングシステムに含まれる機能は、用途(想定されるアプリケーション)によって大きく異なります。たとえば Android には、画面ロック、顔認識、PIN 入力の対応、および位置情報サービスが含まれています。これらは家庭用ルーターのオペレーティングシステムには必要ありませんが、VPN、ゲスト Wi‑Fi、帯域(バンド幅)のスロットリング機能が含まれています。その結果、ハードニング(強化)に関するガイダンスは、使用している特定のデバイスとプラットフォームに合わせて関連付けられます。
Android のハードニングの主なポイント
デバイスのファームウェアが最新であることを確認してください:
次へ進む: Settings | System | System Updates;次を選択 Check for Update。利用可能な更新があればインストールします。
Google Play とセキュリティのアップデートをインストールします:
次へ進む: Settings | Security:
- 次を選択 Google Security Check-Up。利用可能な更新があれば適用します。
- 次を選択 Google Play system update 。利用可能な更新があれば適用します。
一般的なデバイス セキュリティを有効にします:
- 次の場所に移動します:Settings | Security | Device Security そして、次の手順を実行します:
- 「Screen Lock」を 「Enabled」に設定します。
- 「Pattern Visible」を 「Disabled」に設定します。
- 「Automatically Lock」を 「Immediately」に設定します。
- 設定 ‘Power Button Instantly Locks’ を ‘On’ にします。
- デバイス管理者アプリを設定 ‘Find My Device’ を ‘Enabled’ にします。
- 設定 ‘Allow remote lock and erase’ を ‘Enabled’ にします。
2. 次の場所へ移動します:Settings | System | Advanced その後、以下を行います。
- 設定 ‘Developer Options’ を ‘Off’ にします。
3. 次の場所へ移動します:Settings | Apps & Notifications | Advanced | Special App Access その後、次の手順を実行してください:
- ‘Install Unknown Apps’ を ‘Not Allowed’に設定します。
4. 次を起動します: Play Store | Menu その後、次の手順を実行してください:
- ‘My Apps & Games’ を選択し、‘Update All’ をクリックします。
OpenWrt ハードニングの要点
- デフォルトの管理者パスワードを変更してください。
- ファームウェアが常に最新バージョンに更新されていることを確認してください。
Kali Linux のハードニング
Kali Linux は、ペンテスターのための選ばれるプラットフォームになるよう最適化されているため、セキュリティ監査やペネトレーションテストに利用できる幅広いユーティリティが用意されています。
Kali Linux は Debian ベースの Linux ディストリビューションなので、上記の Linux ハードニングのヒントを活用して、Kali Linux システムにおけるセキュリティ上の弱点に対処できます。
Linux Mint のセキュリティ強化
同様に Linux Mint についても、Ubuntu 由来のデスクトップ Linux プラットフォームであるため、Debian-Linux で使用するのと同じ強化手順を採用する必要があります。先の Linux Hardening Checklist の手順を進め、これらを Linux Mint システムに適用してください。
Arch Linux の強化
Debian や Fedora から直接派生したわけではない独立した Linux ディストリビューションである Arch Linux は、どのように何を強化するかという概念は似ているものの、防御(強化)策という観点では個別のケースになります。Arch のコードは、意図的に「ノーフィラー(no filler)」な、合理的に絞り込まれた Linux ディストリビューションとして構築されているため、不必要なサービスの削除/無効化に関しては、強化作業がより少なくて済むでしょう。
最後に
強化されたシステムでも、次のような手口によっては侵害される可能性があります:
- ゼロデイ攻撃——知識がなかったため、結果的に防御できていなかった悪用(エクスプロイト)
- ランサムウェアおよびその他のマルウェア
- ハイジャックされた認証情報を使うハッカーと、アクセス権を悪用するユーザーの両方を含むインサイダー脅威
そのため、システムを強化するだけでなく、追加の防御策も必要です。特に、システムとファイルの整合性(インテグリティ)を監視することが重要です。予期しない変更は、侵害やその他のセキュリティインシデントにつながる可能性があります。Netwrix Change Tracker は、計画外のすべての変更に対してリアルタイムのアラートを提供し、すべての Linux および Unix プラットフォームをサポートします。
共有する