第4章 Oracle Linuxセキュリティの実装
- 4.1 ネットワーク・サービスへのアクセスの構成
- 4.2 パケット・フィルタリング・ファイアウォールの構成
- 4.3 OpenSSHの構成
- 4.4 TCPラッパーの構成
- 4.5 chroot jailの使用によるルート(/)ディレクトリの保護
- 4.6 ソフトウェア管理の構成および使用
- 4.7 データ暗号化の構成および使用
- 4.8 証明書管理の構成および使用
- 4.9 認証の構成および使用
- 4.10 Pluggable Authentication Moduleの構成および使用
- 4.11 アクセス制御リストの構成および使用
- 4.12 SELinuxの構成と使用
- 4.13 監査の構成および使用
- 4.14 システム・ロギングの構成および使用
- 4.15 プロセス・アカウンティングの構成および使用
- 4.16 Linux Containersの構成および使用
- 4.17 カーネル・セキュリティ・メカニズムの構成および使用
この章では、Oracle Linuxシステムのセキュリティを構成する様々な方法について説明します。
4.1 ネットワーク・サービスへのアクセスの構成
ネットワークは一般にITシステムへのプライマリ・エントリ・ポイントであり、ネットワーク侵入防止および検出ツールを使用してセキュリティ侵害を阻止または検出できます。 その後、未使用のネットワーク・サーバーの無効化やパケットフィルタリング・ファイアウォールおよびTCPラッパーの構成などのステップをとることができます。
パケットのロギングおよび分析を実行するために、いくつかのオープンソース・ツールを利用できます。 たとえば、tcpdumpやSnortはTCPトラフィックをキャプチャして、一般にポート・スキャンやネットワークDos攻撃などで発生する不審な使用パターンを分析します。 Sguilにはtcpdump、SnortおよびWiresharkプロトコル・アナライザが組み込まれており、ログの分析およびレポートを簡易化するネットワーク侵入および検出システムが提供されています。
ポート・スキャン・ユーティリティを使用して、システムで実行されているサービスを確認できます。 次の例は、netstat、lsofおよびnmapコマンドがオープンTCPポートおよび関連するサービスについて戻す内容を示しています。
#netstat -tulp
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 localhost:9003 0.0.0.0:* LISTEN 1776/osms-agent tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN 1042/rpcbind tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 2051/sshd tcp6 0 0 [::]:sunrpc [::]:* LISTEN 1042/rpcbind tcp6 0 0 [::]:ssh [::]:* LISTEN 2051/sshd udp 0 0 0.0.0.0:bootpc 0.0.0.0:* 1465/dhclient udp 0 0 0.0.0.0:sunrpc 0.0.0.0:* 1042/rpcbind udp 0 0 localhost:323 0.0.0.0:* 1062/chronyd udp 0 0 0.0.0.0:789 0.0.0.0:* 1042/rpcbind udp6 0 0 [::]:sunrpc [::]:* 1042/rpcbind udp6 0 0 localhost:323 [::]:* 1062/chronyd udp6 0 0 [::]:789 [::]:* 1042/rpcbind #lsof -iTCP -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1042 rpc 8u IPv4 19998 0t0 TCP *:sunrpc (LISTEN) rpcbind 1042 rpc 11u IPv6 20001 0t0 TCP *:sunrpc (LISTEN) osms-agen 1776 root 10u IPv4 26707 0t0 TCP localhost:9003 (LISTEN) sshd 2051 root 3u IPv4 25784 0t0 TCP *:ssh (LISTEN) sshd 2051 root 4u IPv6 25786 0t0 TCP *:ssh (LISTEN) #nmap -sTU 10.0.2.15
Starting Nmap 5.51 ( http://nmap.org ) at 2012-12-10 09:37 GMT Nmap scan report for 10.0.2.15 Host is up (0.0017s latency). Not shown: 1993 closed ports PORT STATE SERVICE 22/tcp open ssh 111/tcp open rpcbind 68/udp open|filtered dhcpc 111/udp open rpcbind 123/udp open ntp 631/udp open|filtered ipp 5353/udp open|filtered zeroconf Nmap done: 1 IP address (1 host up) scanned in 12.66 seconds
詳細は、lsof(8)
、netstat(8)
およびnmap(1)
の各マニュアル・ページを参照してください。
nmapコマンドをインストールまたは使用する前に、ポート・スキャン・ソフトウェアに関する地方条例を確認してください。 管轄区域によっては、ポート・スキャン・ソフトウェアの所有または使用は違法な犯罪行為と見なされます。 ISPによっては、こうしたソフトウェアのプライベート・ネットワーク外での使用を禁じる利用規程が設定されていることがあります。
この章のパケットフィルタリング・ファイアウォールの構成とTCPラッパーの構成という2つの項では、ネットワーク・サービスへのアクセスを制限するための具体的な方法を示します。
4.2 パケット・フィルタリング・ファイアウォールの構成
パケット・フィルタリング・ファイアウォールは、パケットのヘッダー情報に基づいて、受信および送信ネットワーク・パケットをフィルタ処理します。 パケットを受け入れるか拒否するかを決定するパケット・フィルタ・ルールを作成できます。 たとえば、ポートをブロックするルールを作成した場合、そのポートに対するリクエストはすべてファイアウォールでブロックされ、リクエストは無視されます。 ブロックされたポートでリスニングしているサービスはすべて、事実上無効化されます。
Oracle LinuxカーネルはNetfilter機能を使用して、IPv4パケットとIPv6パケットにパケット・フィルタリング機能を提供します。
Netfilterは、次の2つのコンポーネントで構成されます。
-
netfilter
カーネル・コンポーネント。カーネルがネットワーク・パケット・フィルタリングの制御に使用するルールのための、メモリー内の一連のテーブルで構成されます。 -
netfilter
に格納される、ルールを作成、保守、および表示するためのユーティリティ。 Oracle Linux 7では、デフォルトのファイアウォール・ユーティリティはfirewalld
パッケージで提供されるfirewall-cmdです。必要であれば、
iptables
およびiptables6
サービスを有効化して、iptables
パッケージで提供されるiptablesおよびip6tablesユーティリティを使用します。 これらはOracle Linux 6のファイアウォール構成のデフォルトのユーティリティでした。
firewalld
ベースのファイアウォールは、次の点でiptables
ベースのファイアウォールより優れています。
-
iptablesおよびip6tablesコマンドとは異なり、firewalld-cmdを使用してもファイアウォールは再起動されず、確立したTCP接続が中断されません。
-
firewalld
はダイナミック・ゾーンをサポートしており、異なる信頼レベルでネットワークに接続できるラップトップなど、異なるファイアウォール・ルール・セットを実装できます。 この機能は、サーバー・システムで使用することはほとんどありません。 -
firewalld
は、ファイアウォール構成に応じて複数のサービスとの統合をより適切にできるD-Busをサポートしています。
汎用ファイアウォールを実装するには、firewall-config
パッケージで提供されているファイアウォール構成GUI (firewall-config)を使用できます。
図4.1に、ファイアウォール構成GUIを示します。
コマンドラインからファイアウォール構成を作成または変更するには、firewall-cmdユーティリティ(あるいは、必要であればiptablesまたはip6tablesユーティリティ)を使用してパケット・フィルタイリング・ルールを構成します。
パケット・フィルタリング・ルールはfirewalld
に関しては/etc/firewalld
階層、およびiptablesとip6tablesに関しては/etc/sysconfig/iptables
と/etc/sysconfig/ip6tables
ファイルに記録されます。
4.2.1 firewalldファイアウォール・サービスの制御
firewalld
サービスはOracle Linux 7でデフォルトで有効化されています。 systemctlコマンドを使用してサービスを開始、停止、再起動し、そのステータスの問合せを実行できます。
4.2.1.1 firewalldゾーンの構成
システムのファイアウォールが構成されているゾーンをチェックするには:
# firewall-cmd --get-active-zone
システムがゾーンに割り当てられていない場合は、コマンドに結果が表示されません。
次のコマンドを使用して、使用可能なゾーンをすべて表示します。
# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
em1
インタフェースを介して接続されているローカル・ネットワーク上でwork
ゾーンのシステムを構成するには:
# firewall-cmd --zone=work --change-interface=em1
success
現在のゾーンのクエリを実行すると、ファイアウォールがwork
ゾーンのインタフェースem1
に構成されていることが表示されます。
# firewall-cmd --get-active-zone
work
interfaces: em1
永続的に変更するには、次のようにシステムのデフォルト・ゾーンを変更できます。
#firewall-cmd --get-default-zone
public #firewall-cmd --set-default-zone=work
success #firewall-cmd --get-default-zone
work
4.2.1.2 サービスへのアクセスの制御
サービスへのアクセスは、名前を指定すると許可または拒否できます。 次のコマンドは、work
ゾーンのローカル・システム上でアクセスが許可されるサービスをリストします。
# firewall-cmd --zone=work --list-services
ssh samba
この例では、SSHおよびSambaクライアントによるアクセスが許可されます。
work
ゾーンがアクティブなときにNFSおよびHTTPクライアントによるアクセスを許可するには、--add-serviceオプションを使用します。
#firewall-cmd --zone=work --add-service=http --add-service=nfs
success #firewall-cmd --zone=work --list-services
http nfs ssh samba
ゾーンを指定しない場合、変更は現在アクティブなゾーンではなく、デフォルトのゾーンに適用されます。
再起動後もルールを維持するには、--permanentオプションを指定してコマンドを再実行します。
# firewall-cmd --permanent --zone=work --add-service=http --add-service=nfs
success
サービスへのアクセスを削除するには、次のように--remove-serviceオプションを使用します。
#firewall-cmd --zone=work --remove-service=samba
success #firewall-cmd --permanent --zone=work --remove-service=samba
success #firewall-cmd --zone=work --list-services
http nfs ssh
4.2.1.3 ポートへのアクセスの制御
ポートへのアクセスは、ポート番号と関連するプロトコルを指定すると許可または拒否できます。 --list-portオプションは、次のように明示的にアクセスを許可したポートと関連するプロトコルをリストします。
# firewall-cmd --zone=work --list-ports
3689/tcp
--add-portオプションを使用すると、アクセスを許可できます。
#firewall-cmd --zone=work --add-port=5353/udp
success #firewall-cmd --permanent --zone=work --add-port=5353/udp
success #firewall-cmd --zone=work --list-ports
5353/udp 3689/tcp
同様に、--remove-portオプションでポートへのアクセスを削除できます。 変更内容を維持する場合は--permanantオプションを指定してコマンドを再実行するということを覚えておいてください。
ゾーンに定義されているファイアウォール・ルールをすべて表示するには、--list-allオプションを使用します。
# firewall-cmd --zone=work --list-all
work (default,active)
interfaces: em1
sources:
services: http nfs ssh
ports: 5353/udp 3689/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
詳細は、firewall-cmd(1)
マニュアル・ページを参照してください。
4.2.2 iptablesファイアウォール・サービスの制御
firewalld
ではなくiptables
を使用する場合、iptables
ファイアウォール・サービスを起動し、システムのブート時に開始されるように有効にするには、最初にfirewalld
サービスを停止し、無効化します。
#systemctl stop firewalld
#systemctl disable firewalld
#systemctl start iptables
#systemctl enable iptables
サービスが次に開始したときにファイアウォール・ルールに加えた変更をロードするように、変更内容を/etc/sysconfig/iptables
に保存するには、次のようにします。
# /sbin/iptables-save > /etc/sysconfig/iptables
/etc/sysconfig/iptables
からルールが再度読み取られるようにサービスを再起動するには:
# systemctl restart iptables
サービスを停止するには:
# systemctl stop iptables
IPv6フィルタリングを制御するには、iptables
ではなくip6tables
を使用します。
詳細は、iptables(8)
,およびip6tables(8)
の各マニュアル・ページを参照してください。
4.2.2.1 iptablesおよびip6tablesで使用されるnetfilterテーブルについて
iptablesおよびip6tablesで使用されるnetfilter
テーブルには、次のものが含まれます。
-
Filter
-
デフォルトのテーブルで、主にコンテンツに基づいてパケットを削除または受け入れるために使用されます。
-
Mangle
-
このテーブルは、パケット内の特定フィールドを変更するために使用されます。
-
NAT
-
ネットワーク・アドレス変換テーブルは、新規接続を作成するパケットのルーティングに使用されます。
カーネルは、これらのテーブルに格納されているルールを使用して、ネットワーク・パッケージ・フィルタリングに関する決定を行います。 各ルールは、1つ以上の条件と1つのアクションで構成されます。 ルールの条件とネットワーク・パケット・ヘッダーの情報が一致した場合、カーネルはパケットにアクションを適用します。 アクションの例を次に示します。
-
ACCEPT
-
パケットの処理を続行します。
-
DROP
-
通知なしでパケットの寿命を終了します。
-
REJECT
-
DROP
と同じですが、さらにパケットがブロックされたことを送信システムに通知します。
ルールはチェーンに格納され、各チェーンはデフォルト・ポリシーとゼロ以上のルールで構成されます。 カーネルは一致が見つかるまで、チェーン内の各ルールをパケットに適用します。 一致するルールがない場合、カーネルはチェーンのデフォルト・アクション(ポリシー)をパケットに適用します。
netfilter
テーブルにはそれぞれ、複数の事前定義済チェーンがあります。 filter
テーブルには、次のチェーンが含まれます。
-
FORWARD
-
ローカル・システム宛てでないパケットは、このチェーンを通過します。
-
INPUT
-
ローカル・システム宛てのインバウンド・パケットは、このチェーンを通過します。
-
OUTPUT
-
ローカルで作成されたパケットは、このチェーンを通過します。
チェーンは永続的であり、削除できません。 ただし、フィルタ・テーブルに追加のチェーンを作成することはできます。
4.2.2.2 ファイアウォール・ルールのリスト
filter
テーブルのチェーンのファイアウォール・ルールをリストするには、iptables -Lコマンドを使用します。 次に、新しくインストールしたシステムのデフォルト・ルールの例を示します。
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT udp -- anywhere anywhere state NEW udp dpt:ipp
ACCEPT udp -- anywhere 224.0.0.251 state NEW udp dpt:mdns
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ipp
ACCEPT udp -- anywhere anywhere state NEW udp dpt:ipp
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
この例では、各チェーンのデフォルト・ポリシーはACCEPT
です。 よりセキュアなシステムにするは、デフォルト・ポリシーをDROP
にして、追加のルールでその都度特定のパケットのみを許可します。
チェーンを変更する場合は、--line-numbersオプションを指定して、ルールの番号を確認します。
# iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
5 ACCEPT udp -- anywhere anywhere state NEW udp dpt:ipp
6 ACCEPT udp -- anywhere 224.0.0.251 state NEW udp dpt:mdns
7 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ipp
8 ACCEPT udp -- anywhere anywhere state NEW udp dpt:ipp
9 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
4.2.2.3 チェーンに対するルールの挿入および置換
チェーンにルールを挿入するには、iptables -Iコマンドを使用します。 たとえば、次のコマンドはINPUT
チェーンにルールを挿入して、ポート80でのTCPによるアクセスを許可します。
#iptables -I INPUT 4 -p tcp -m tcp --dport 80 -j ACCEPT
#iptables -L --line-numbers
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere tcp dpt:http 5 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 6 ACCEPT udp -- anywhere anywhere state NEW udp dpt:ipp 7 ACCEPT udp -- anywhere 224.0.0.251 state NEW udp dpt:mdns 8 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ipp 9 ACCEPT udp -- anywhere anywhere state NEW udp dpt:ipp 10 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination
iptables -Lからの出力は、新しいエントリがルール4として挿入され、古いルール4から9は位置5から10に下げられたことを示します。 TCP宛先ポート80はhttp
で表され、/etc/services
ファイル内の次の定義に対応します(HTTPデーモンはポート80でクライアント・リクエストをリスニングします)。
http 80/tcp www www-http # WorldWideWeb HTTP
チェーンのルールを置換するには、iptables -Rコマンドを使用します。 たとえば、次のコマンドはINPUT
チェーンのルール4を置換して、ポート443でのTCPによるアクセスを許可します。
#iptables -I INPUT 4 -p tcp -m tcp --dport 443 -j ACCEPT
#iptables -L --line-numbers
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere tcp dpt:https ...
TCP宛先ポート443はhttps
で表され、/etc/services
ファイル内のポート443のセキュアなHTTPに関する次の定義に対応します。
https 443/tcp # http protocol over TLS/SSL
4.2.2.4 チェーンでのルールの削除
チェーンでルールを削除するには、iptables -Dコマンドを使用します。 たとえば、次のコマンドはINPUT
チェーンからルール4を削除します。
# iptables -D INPUT 4
1つのチェーン内のすべてのルールを削除するには、次のように入力します。
# iptables -F chain
すべてのチェーン内のすべてのルールを削除するには、次のように入力します。
# iptables -F
4.2.2.5 ルールの保存
iptables
サービスが次に開始したときに変更が加えられたファイアウォール・ルールがロードされるように、変更内容を保存するには、次のコマンドを使用します。
# /sbin/iptables-save /etc/sysconfig/iptables
このコマンドはルールを/etc/sysconfig/iptables
に保存します。 IPv6の場合、/sbin/ip6tables-save > /etc/sysconfig/ip6tablesを使用してルールを/etc/sysconfig/ip6tables
に保存できます。
4.3 OpenSSHの構成
OpenSSHは、システム間のセキュアな通信を提供する、ネットワーク接続ツールのスイートです。 OpenSSHにより、ネットワーク・トラフィックが外部の脅威を受けないようにすることで、お客様の組織をもう一段階保護します。 詳細は、Oracle® Linux: OpenSSHを使用したリモート・システムへの接続を参照してください。
4.4 TCPラッパーの構成
TCPラッパーは、受信ネットワーク・トラフィックの基本的なフィルタリングを提供します。 他のシステムからLinuxサーバー上で実行されている特定のwrappedネットワーク・サービスへのアクセスを、許可または拒否します。 ラップされたネットワーク・サービスとは、libwrap.a
ライブラリに対してコンパイルされたサービスです。 sshdデーモンの次の例に示されているように、lddコマンドを使用してネットワーク・サービスがラップされているかどうかを確認できます。
# ldd /usr/sbin/sshd | grep libwrap
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f877de07000)
リモート・クライアントがシステム上のネットワーク・サービスに接続しようとすると、ラッパーは構成ファイル/etc/hosts.allow
および/etc/hosts.deny
ファイルのルールに問い合せてアクセスが許可されるかどうかを判断します。
サービスのラッパーはまず、/etc/hosts.allow
を上から順番に読み取ります。 デーモンとクライアントの組合せがファイル内のエントリと一致する場合、アクセスは許可されます。 /etc/hosts.allow
で一致が見つからない場合、ラッパーは/etc/hosts.deny
を上から順番に読み取ります。 デーモンとクライアントの組合せがファイル内のエントリと一致する場合、アクセスは拒否されます。 デーモンとクライアントの組合せのルールがどのファイルにもない場合、またはどちらのファイルも存在しない場合、サービスへのアクセスは許可されます。
ラッパーはまず/etc/hosts.allow
で指定されたルールを適用し、これらのルールが/etc/hosts.deny
で指定されたルールよりも優先されるようにします。 /etc/hosts.allow
で定義されたルールによりサービスへのアクセスが許可される場合、同じサービスへのアクセスを拒否する/etc/hosts.deny
内のルールはすべて無視されます。
ルールは次の形式をとります。
daemon_list
:client_list
[:command
] [: deny]
前述の例では、daemon_list
およびclient_list
はデーモンおよびクライアントのカンマ区切りリストであり、クライアントがデーモンへのアクセスを試みるときにオプションのcommand
が実行されます。 すべてのデーモンまたはすべてのクライアントを表すには、キーワードALL
を使用します。 サブネットは、*
ワイルドカードを使用して表します(例: 192.168.2.*
)。 ドメインは、ドメイン名にピリオド(.
)の接頭辞を付けて表します(例: .example.com
)。 オプションのdeny
キーワードを付けると、/etc/hosts.allow
ファイルで指定されているルールの場合でも接続が拒否されます。
次に、ルールの例をいくつか示します。
すべてのクライアントのscp、sftpおよびsshアクセス(sshd
)を照合します。
sshd : ALL
192.168.2サブネット上のすべてのクライアントのFTPアクセス(vsftpd
)を照合します。
vsftpd : 192.168.2.*
example.com
ドメイン内のすべてのクライアントを照合して、すべてのラップ済サービスにアクセスできるようにします。
ALL : .example.com
すべてのクライアントのFTPアクセスを照合し、バナー・ファイル/etc/banners/vsftpd
の内容を表示します。 バナー・ファイルの名前はデーモンと同じである必要があります。
vsftpd : ALL : banners /etc/banners/
200.182.68
サブネット上のすべてのクライアントのすべてのラップ済サービスを照合し、すべての当該イベントをログに記録します。 %c
および%d
トークンは、クライアントおよびデーモンの名前に拡張されます。
ALL : 200.182.68.* : spawn /usr/bin/echo `date` “Attempt by %c to connect to %d" >> /var/log/tcpwr.log
すべてのクライアントのscp、sftpおよびsshアクセスを照合し、イベントをemerg
メッセージとしてログに記録します。このメッセージはコンソールに表示されます。
sshd : ALL : severity emerg
forbid.com
ドメイン内のすべてのクライアントのscp、sftpおよびsshアクセスを照合し、イベントをログに記録し、アクセスを拒否します(そのルールが/etc/hosts.allow
内にある場合でも同様)。
sshd : .forbid.com : spawn /usr/bin/echo `date` "sshd access denied for %c" >>/var/log/sshd.log : deny
詳細は、hosts_access(5)
マニュアル・ページを参照してください。
4.5 chroot jailの使用によるルート(/)ディレクトリの保護
chroot操作は、実行中のプロセスとその子の目に見えるルート・ディレクトリを変更します。 この操作により、/
以外のルート・ディレクトリでプログラムを実行できます。 プログラムからは指定されたディレクトリ・ツリー外のファイルは見えず、アクセスもできません。 このような人為的なルート・ディレクトリをchroot jailと呼びます。その目的は、攻撃者のディレクトリへのアクセスを制限することです。 Chroot jailにより、指定されたプロセスおよびプロセスで使用されているユーザーIDがロックダウンされるため、これらのプロセスおよびユーザーIDにはプロセスを実行中のディレクトリしか見えません。 プロセスにとっては、実行中のディレクトリがルート・ディレクトリとなります。
chrootメカニズムでは、意図的な改ざんや特権ユーザーによるシステム・デバイスへの低レベルのアクセスを防ぐことはできません。 たとえば、chroot root
ユーザーはデバイス・ノードを作成し、その上にファイル・システムをマウントできます。 また、root
権限を取得し、chroot()
を使用して現在の作業ディレクトリを実際のroot
ディレクトリに変更できた場合、プログラムはchroot jailから脱出できます。 このため、chroot jailにroot
が所有するsetuid
はsetgid
実行可能ファイルが含まれていないことを確認する必要があります。
chrootプロセスを正常に開始するには、chrootディレクトリに必要なすべてのプログラム・ファイル、構成ファイル、デバイス・ノード、共有ライブラリを移入する必要があります。それぞれを、chrootディレクトリのレベルに対して相対的な、予期される場所に移入します。
4.5.1 Chroot JailでのDNSおよびFTPサービスの実行
DNS名前サービス・デーモン(named
)がchroot jailで実行される場合、BIND Exploitを利用してシステムに入ったハッカーは、chroot jailディレクトリの下のファイルに隔離されます。 bind-chroot
パッケージをインストールすると、/var/named/chroot
ディレクトリが作成され、これがすべてのBINDファイルのchroot jailとなります。
クライアントに対して自動的にchroot jailを起動するように、vsftpd
FTPサーバーを構成できます。 デフォルトでは、匿名ユーザーはchroot jailに配置されます。 ただし、vsftpd
FTPサーバーにアクセスしたローカル・ユーザーはそれぞれのホーム・ディレクトリに配置されます。 ローカル・ユーザーをそれぞれのホーム・ディレクトリに基づいてchroot jailに配置するには、/etc/vsftpd/vsftpd.conf
ファイルでchroot_local_user=YES
オプションを指定します。
4.5.2 Chroot Jailの作成
Chroot jailを作成するには:
-
Chroot jailのルート・ディレクトリとなるディレクトリを作成します。次に例を示します。
#
mkdir /home/oracle/jail
-
lddコマンドを使用して、/usr/bin/bashなど、chroot jailで実行するコマンドで必要なライブラリを見つけます。
#
ldd /usr/bin/bash
linux-vdso.so.1 => (0x00007fffdedfe000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003877000000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003861c00000) libc.so.6 => /lib64/libc.so.6 (0x0000003861800000) /lib64/ld-linux-x86-64.so.2 (0x0000003861000000)注意パスが
/lib64
として表示されていても、/lib64
は/usr/lib64
へのシンボリック・リンクのため、実際のパスは/usr/lib64
です。 同様に、/bin
は/usr/bin
へのシンボリック・リンクです。 このようなシンボリック・リンクはchroot jail内で再作成する必要があります。 -
chroot jailのルート・ディレクトリのサブディレクトリを作成します。このサブディレクトリの相対パスは、コマンド・バイナリとその必須ライブラリの実際のルート・ディレクトリからの相対パスと同じです。例を示します。
#
mkdir -p /home/oracle/jail/usr/bin
#mkdir -p /home/oracle/jail/usr/lib64
-
バイナリおよびライブラリ・ディレクトリにリンクするシンボリック・リンクは、実際のルート・ディレクトリに存在するシンボリック・リンクと同じ方法で作成します。
#
ln -s /home/oracle/jail/usr/bin /home/oracle/jail/bin
#ln -s /home/oracle/jail/usr/lib64 /home/oracle/jail/lib64
-
バイナリと共有ライブラリを、chroot jailのルート・ディレクトリの下のディレクトリにコピーします。次に例を示します。
#
cp /usr/bin/bash /home/oracle/jail/usr/bin
#cp /usr/lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2}
\/home/oracle/jail/usr/lib64
4.5.3 Chroot Jailの使用
既存のディレクトリのchroot jailでコマンドを実行するには(chroot_jail
)、次のコマンドを使用します。
# chroot chroot_jail
command
コマンド引数が指定されていない場合、chrootはSHELL
環境変数の値を実行し、SHELL
が設定されていない場合は/usr/bin/sh
を実行します。
たとえば、chroot jailで/usr/bin/bashを実行する場合(4.5.2項「Chroot Jailの作成」の説明に従って前もって設定)は、次のようになります。
#chroot /home/oracle/jail
bash-4.2#pwd
/ bash-4.2#ls
bash: ls: command not found bash-4.2#exit
exit #
このシェルでpwdなどの組込みのシェル・コマンドを実行することはできますが、バイナリおよび必要な共有ライブラリをchroot jailにコピーしないかぎり、他のコマンドは実行できません。
詳細は、chroot(1)
マニュアル・ページを参照してください。
4.6 ソフトウェア管理の構成および使用
Oracle Linuxでは、RPMパッケージのインストールまたはアップグレードに使用できるyumコマンドが用意されています。 yumを使用する主な利点は、パッケージの依存関係もインストールまたはアップグレードされる点です。 yumコマンドではOracle Linux yumサーバーやUnbreakable Linux Network (ULN)などにあるリポジトリからパッケージがダウンロードされますが、インターネットにアクセスできないシステム上で独自のリポジトリを設定することもできます。
yumユーティリティの使用によるソフトウェアの管理の詳細は、Oracle® Linux 7: ソフトウェアの管理を参照してください。
Oracle Linux yumサーバーは、Oracle Linuxパッケージをインストール・メディアからインストールするよりも簡単にインストールするための方法です。 Oracle Linuxの更新情報メーリング・リストにサブスクライブして、バグ修正、セキュリティ修正および拡張機能を取得することもできます。 https://yum.oracle.com/でそのサーバーにアクセスできます。
システムをULNに登録済の場合は、ULNチャネルでyumを使用して、システム上のソフトウェアを管理できます。
RPMパッケージ・マネージャを使用して、インストールされたシステム・ファイルの整合性を検証できます。 rpm -V package
およびrpm -Vf filename
コマンドは、パッケージとファイルをそれぞれRPMデータベース内のパッケージ・メタデータと比較して検証します。 検証操作では、ファイル・サイズ、MD3サム、権限、タイプ、所有者、グループを比較して、差異があれば表示します。 詳細な情報を表示するには、-vオプションを指定します。 rpm -qaコマンドを使用すると、システムにインストールされたすべてのパッケージの整合性を検証できます。次に例を示します。
#for i in `rpm -qa`
>do
>rpm -V $i > .tmp || echo -e "\nDiscepancies for package $i" && cat .tmp
>rm -f .tmp
>done
Discepancies for package gdm-2.30.4-33.0.1.el6_2.x86_64 .M....G.. /var/log/gdm .M....... /var/run/gdm missing /var/run/gdm/greeter Discepancies for package libgcj-4.4.6-4.el6.x86_64 ..5....T. c /usr/lib64/security/classpath.security Discepancies for package sudo-1.7.4p5-12.el6_3.x86_64 S.5....T. c /etc/sudoers Discepancies for package libcgroup-0.37-4.el6.x86_64 S.5....T. c /etc/cgconfig.conf Discepancies for package yum-3.2.29-30.0.1.el6.noarch .......T. c /etc/yum.conf Discepancies for package kernel-2.6.32-279.el6.x86_64 .......T. /etc/ld.so.conf.d/kernel-2.6.32-279.el6.x86_64.conf ...
文字コードの文字列は、インストールされたファイルとそのファイルのメタデータとの差異を示します。 次の表では、rpm -Vコマンドの出力での文字コードの意味を示します。
コード |
相違の説明 |
---|---|
|
MD5サム。 |
|
デバイスのメジャーまたはマイナー番号。 |
|
グループの所有権。 |
|
シンボリック・リンク・パス。 |
|
権限またはファイル・タイプを含むモード。 |
|
機能。 |
|
ファイル・サイズ。 |
|
変更時刻。 |
|
ユーザーの所有権。 |
|
なし(テストに合格)。 |
|
不明(テストを実行できなかった)。 |
影響を受けたファイルの前に単一の文字コードが表示されている場合、これはファイルのタイプを示し、次の表に示す値をとります。
コード |
説明 |
---|---|
|
構成ファイル。 |
|
ドキュメント・ファイル。 |
|
ファイルの内容がパッケージ・ペイロードに含まれないゴースト・ファイル。 |
|
ライセンス・ファイル。 |
|
Readmeファイル。 |
差異の多くは、サブシステムの構成ファイルを編集したことによるものです。 一定期間に変更されたファイルを確認するには、インストール後ただちに差異のベースライン・ファイルを作成し、このファイルと後からrpm -Vによって見つかった結果との差分(diff)を検出します。
ファイル整合性チェッカーを使用して、システムか損われているかどうかをテストすることもできます。 AIDE (Advanced Intrusion Detection Environment)やTripwireなど、いくつかのオープン・ソースおよび商用ファイル整合性チェック・ツールを利用できます。 AIDEおよびTripwireは、ファイル・システムをスキャンして、各ファイルの暗号化ハッシュをデータベースに記録する侵入検出システムです。 データベースの作成後、データベースを読取り専用メディアに移動して、改ざんされるのを防ぐ必要があります。 その後のファイル・システム・チェックでは、保存されているチェックサムが現在のファイルのチェックサムと一致しない場合、ツールによって警告されます。 詳細は、AIDEまたはTripwireのWebサイトを参照してください。
詳細は、yum(8)
マニュアル・ページを参照してください。
4.6.1 更新およびパッチ管理の構成
効果的なセキュリティプラクティスを実現するには、システム・ソフトウェアを最新に保つことが大切です。 このため、システム・セキュリティ・アップデートが発行されたらすぐに適用する必要があります。 すべてのITシステムを更新管理インフラストラクチャに登録することを強くお薦めします。 Oracle Linuxシステムの場合、Unbreakable Linuxネットワーク(ULN)がシステム・ソフトウェアのリリース・レベルをトラッキングして、重要な更新が利用可能になり次第すぐに通知します。 更新および更新情報は、Oracle Linux yumサーバーからも無料で入手できます。
カーネルまたはコア・システム・ライブラリを更新したら、通常、システム・リブートが必要になります。 ミッションクリティカルなエンタープライズおよびクラウド環境では、予定されたメンテナンス・ウィンドウ中にシステムをリブートするまで、重要な更新がインストールされないことがあります。 この結果、既知の脆弱性から保護されないまま、重要なビジネス・アプリケーションをサポートするシステムが実行されることがあります。 この問題に対処するために、Oracle Linux Premier Supportには、Oracle Kspliceへのアクセスが含まれています。これは、再起動の必要なく、実行中のカーネルにセキュリティ更新、パッチ、重要な不具合修正を適用できる革新的なテクノロジです。 Kspliceにより、停止時間なしでの更新が可能になることで、Oracle Linuxシステムのセキュリティ、信頼性、可用性が向上します。これは、停止時間やサービス中断なしでシステムを最新の状態に保つために役立ちます。
Kspliceの詳細は、https://oss.oracle.com/ksplice/docs/ksplice-quickstart.pdfを参照してください。
4.6.2 Yumセキュリティ・プラグインのインストールおよび使用
yum-plugin-security
パッケージにより、yumコマンドを使用して、ご使用のシステム用に提供されているすべての更新情報(セキュリティ更新など)のリストを取得できるようになります。 さらに、Oracle Enterprise Manager 12c Cloud Controlや管理ツール(Katello、Pulp、Red Hat Satellite、Spacewalk、SUSE Managerなど)を使用して、更新情報を抽出および表示できます。
yum-plugin-security
パッケージをインストールするには、次のコマンドを入力します。
# yum install yum-plugin-security
システムで利用できる更新情報をリストするには、次のように入力します。
# yum updateinfo list
Loaded plugins: refresh-packagekit, rhnplugin, security
ELBA-2012-1518 bugfix NetworkManager-1:0.8.1-34.el6_3.x86_64
ELBA-2012-1518 bugfix NetworkManager-glib-1:0.8.1-34.el6_3.x86_64
ELBA-2012-1518 bugfix NetworkManager-gnome-1:0.8.1-34.el6_3.x86_64
ELBA-2012-1457 bugfix ORBit2-2.14.17-3.2.el6_3.x86_64
ELBA-2012-1457 bugfix ORBit2-devel-2.14.17-3.2.el6_3.x86_64
ELSA-2013-0215 Important/Sec. abrt-2.0.8-6.0.1.el6_3.2.x86_64
ELSA-2013-0215 Important/Sec. abrt-addon-ccpp-2.0.8-6.0.1.el6_3.2.x86_64
ELSA-2013-0215 Important/Sec. abrt-addon-kerneloops-2.0.8-6.0.1.el6_3.2.x86_64
ELSA-2013-0215 Important/Sec. abrt-addon-python-2.0.8-6.0.1.el6_3.2.x86_64
ELSA-2013-0215 Important/Sec. abrt-cli-2.0.8-6.0.1.el6_3.2.x86_64
ELSA-2013-0215 Important/Sec. abrt-desktop-2.0.8-6.0.1.el6_3.2.x86_64
...
コマンドからの出力では、利用可能な更新情報がID順にソートされ、各更新情報がセキュリティ・パッチ(severity
/Sec.
)、バグ修正(bugfix
)または機能拡張(enhancement
)のいずれであるかが指定されます。 セキュリティ・パッチは、重大度(Important
、Moderate
またはLow
)別にリストされます。
次の例のように、--sec-severityオプションを使用すると、セキュリティ更新情報を重大度でフィルタ処理できます。
# yum updateinfo list --sec-severity=Moderate
Loaded plugins: refresh-packagekit, rhnplugin, security
ELSA-2013-0269 Moderate/Sec. axis-1.2.1-7.3.el6_3.noarch
ELSA-2013-0668 Moderate/Sec. boost-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-date-time-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-devel-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-filesystem-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-graph-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-iostreams-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-program-options-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-python-1.41.0-15.el6_4.x86_64
...
更新情報IDではなく、共通脆弱性(CVE) ID順にセキュリティ更新情報をリストするには、キーワードcvesを引数として指定します。
# yum updateinfo list cves
Loaded plugins: refresh-packagekit, rhnplugin, security
CVE-2012-5659 Important/Sec. abrt-2.0.8-6.0.1.el6_3.2.x86_64
CVE-2012-5660 Important/Sec. abrt-2.0.8-6.0.1.el6_3.2.x86_64
CVE-2012-5659 Important/Sec. abrt-addon-ccpp-2.0.8-6.0.1.el6_3.2.x86_64
CVE-2012-5660 Important/Sec. abrt-addon-ccpp-2.0.8-6.0.1.el6_3.2.x86_64
CVE-2012-5659 Important/Sec. abrt-addon-kerneloops-2.0.8-6.0.1.el6_3.2.x86_64
CVE-2012-5660 Important/Sec. abrt-addon-kerneloops-2.0.8-6.0.1.el6_3.2.x86_64
CVE-2012-5659 Important/Sec. abrt-addon-python-2.0.8-6.0.1.el6_3.2.x86_64
CVE-2012-5660 Important/Sec. abrt-addon-python-2.0.8-6.0.1.el6_3.2.x86_64
...
同様に、キーワードbugfix、enhancementおよびsecurityを使用して、すべてのバグ修正、拡張およびセキュリティ更新情報のリストをフィルタ処理します。
次の例のように、--cveオプションを使用すると、指定したCVEに対応する更新情報を表示できます。
# yum updateinfo list --cve CVE-2012-2677
Loaded plugins: refresh-packagekit, rhnplugin, security
ELSA-2013-0668 Moderate/Sec. boost-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-date-time-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-devel-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-filesystem-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-graph-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-iostreams-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-program-options-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-python-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-regex-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-serialization-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-signals-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-system-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-test-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-thread-1.41.0-15.el6_4.x86_64
ELSA-2013-0668 Moderate/Sec. boost-wave-1.41.0-15.el6_4.x86_64
updateinfo list done
次の例のように、詳細情報を表示するには、listではなくinfoを指定します。
# yum updateinfo info --cve CVE-2012-2677
Loaded plugins: refresh-packagekit, rhnplugin, security
===============================================================================
boost security update
===============================================================================
Update ID : ELSA-2013-0668
Release : Oracle Linux 6
Type : security
Status : final
Issued : 2013-03-21
CVEs : CVE-2012-2677
Description : [1.41.0-15]
: - Add in explicit dependences between some boost
: subpackages
:
: [1.41.0-14]
: - Build with -fno-strict-aliasing
:
: [1.41.0-13]
: - In Boost.Pool, be careful not to overflow
: allocated chunk size (boost-1.41.0-pool.patch)
:
: [1.41.0-12]
: - Add an upstream patch that fixes computation of
: CRC in zlib streams.
: - Resolves: #707624
Severity : Moderate
updateinfo info done
セキュリティ関連の更新情報が利用可能なすべてのパッケージを最新バージョンのパッケージ(パッケージにバグ修正または新機能が含まれるがセキュリティ更新情報は含まれない場合でも)に更新するには、次のように入力します。
# yum --security update
すべてのパッケージを、セキュリティ更新情報が含まれる最新バージョン(セキュリティ更新情報が含まれない新しいパッケージは対象外)に更新するには、次のように入力します。
# yum --security update-minimal
すべてのカーネル・パッケージを、セキュリティ更新情報が含まれる最新バージョンに更新するには、次のように入力します。
# yum --security update-minimal kernel*
また、次の例のように、1つのCVEまたは更新情報に対応するパッケージのみを更新することもできます。
#yum update --cve CVE-2012-3954
#yum update --advisory ELSA-2012-1141
一部の更新ではシステムを再起動する必要があります。 デフォルトでは、ブート・マネージャによって最新のカーネル・バージョンが自動的に有効化されます。
詳細は、yum-security(8)
マニュアル・ページを参照してください。
4.7 データ暗号化の構成および使用
データ暗号化を使用して、保存されているデータまたは転送されるデータを保護できます。 ストレージ・デバイスおよびメディア上のデータは、漏えいするリスクまたはデバイスが紛失するリスクがあります。 ローカル・エリア・ネットワークおよびインターネットで転送されるデータは、インターセプトまたは変更される可能性があります。 また、プライバシ・データおよび個人データを保護するデータ暗号化はますます、企業のセキュリティ・ポリシーおよび政府規制(HIPAA、GLBA、SOX、PCI DSSなど)の必須要件となっています。
Oracle Linuxシステムには、データを保護するための方法がいくつか用意されています。
-
システムおよびアプリケーション・ソフトウェアをインストールする際、デジタル署名されたRPMパッケージのみを受け入れます。 ダウンロードしたソフトウェア・パッケージが署名済であることを確認するには、リポジトリ構成ファイルで
gpgcheck=1
を設定して、ソフトウェア・サプライヤから提供されたGPGキーをインポートします。 暗号化を使用して通信チャネルを保護するSecure Sockets Layer (SSL)プロトコルを使用して、RPMをインストールすることもできます。 -
特にラップトップ、外部ハード・ドライブおよびUSBメモリー・スティックなどのリムーバブル・デバイスでデータ漏えいを防止するには、フルディスク暗号化の使用を検討します。 Oracle Linuxでは、
dm-crypt
カーネル・モジュールおよびLinux Unified Key Setup (LUKS)形式を使用したブロック・デバイス暗号化がサポートされています。 cryptsetup管理コマンドは、cryptsetup
パッケージにあります。 これらの技術では、システムがオフのときにデータにアクセスできないように、デバイス・パーティションを暗号化します。 システムをブートして適切なパスフレーズを指定すると、デバイスは復号化され、データにアクセスできるようになります。 詳細は、cryptsetup(8)
マニュアル・ページを参照してください。 -
Oracle Linuxは暗号化を使用して、仮想プライベート・ネットワーク(VPN)、セキュア・シェル(ssh)、パスワード保護をサポートします。 デフォルトでは、Oracle Linuxは強力なパスワード・ハッシュ・アルゴリズム(SHA-512)を使用し、ハッシュ・パスワードを
/etc/shadow
ファイルに保存します。 -
Oracle Linuxは、AESアルゴリズムの実行、およびx86/x86_64アーキテクチャでのSHA-1/RC4アルゴリズムの実行を高速化するAdvanced Encryption Standard New Instructions (AES-NI)命令セットをサポートするIntel CPUで、ハードウェア・アクセラレーション暗号化を利用します。
4.8 証明書管理の構成および使用
公開キー・インフラストラクチャ(PKI)では、ネットワーク接続を暗号化および検証するためのツールとフレームワークが提供されます。 また、署名付き証明書の形式での認証メカニズムも提供されます。 証明書の管理と強力な公開キー・インフラストラクチャの実装は、お客様の組織内で優れたセキュリティを維持するための重要部分です。 詳細は、Oracle® Linux: 証明書と公開キー・インフラストラクチャの管理を参照してください
4.9 認証の構成および使用
認証とは、ユーザーのアイデンティティを検証する方法です。 オペレーティング・システムにより、システムに格納されているデータとこの情報を比較することでユーザー名とパスワードが認証されます。 ログイン資格証明がそのデータと一致する場合は、システムへのアクセスが許可されます。 詳細は、Oracle® Linux 7: システム・アカウントおよび認証の設定を参照してください。
4.10 Pluggable Authentication Moduleの構成および使用
Pluggable Authentication Modules (PAM)機能は、アプリケーションでユーザー資格証明を検証するための認証メカニズムです。 詳細は、Oracle® Linux 7: システム・アカウントおよび認証の設定を参照してください。
4.11 アクセス制御リストの構成および使用
POSIXアクセス制御リスト(ACL)は、所有者、グループおよび他のすべてのシステム・ユーザーの読取り、書込み、実行権限を設定する従来のUNIX任意アクセス制御(DAC)よりも豊富なアクセス制御モデルを提供します。 複数のユーザーまたはグループのアクセス権を定義し、プログラム、プロセス、ファイル、ディレクトリの権限を指定するACLを構成できます。 ディレクトリにデフォルトのACLを設定すると、その子孫が同じ権限を自動的に継承します。 カーネルは、ext3
、ext4
およびNFSエクスポート・ファイル・システムにACLサポートを提供します。
次に、ディレクトリおよびファイルのACLを設定および表示する例を示します。
ユーザーにファイルまたはディレクトリへの読取りアクセス権を付与します。
# setfacl -m u:user
:r file
ファイルまたはディレクトリの名前、所有者、グループおよびACLを表示します。
# getfacl file
ACLではなく有効な権限マスクを変更して、すべてのグループおよびユーザーのファイルへの読取りアクセスを削除します。
# setfacl -m m::rx file
ファイルのACLからグループのエントリを削除します。
# setfacl -x g:group
file
ファイルf1
のACLをファイルf2
にコピーします。
# getfacl f1
| setfacl --set-file=- f2
ディレクトリのACL設定を、継承可能なデフォルトのACL設定に昇格させます。
# getfacl --access dir
| setfacl -d -M- dir
ACLの管理方法の詳細は、setfacl(1)
およびgetfacl(1)
マニュアル・ページを参照してください。
4.12 SELinuxの構成と使用
SELinuxは、Oracle Linuxシステムにアクセス制御ポリシーを適用および実装して、悪意のあるアクセスや不正アクセスからサービスおよびファイルを保護するカーネル・モジュールです。 ポリシーの管理およびアクセスの問題の解決には、SELinuxユーザー空間ツールを使用します。 詳細は、Oracle® Linux: SELinuxの管理を参照してください
4.13 監査の構成および使用
監査では、分析可能なカーネル・レベルでデータを収集して、不正なアクティビティを識別します。 監査では、システム・ロギングよりもはるかに詳細なデータが数多く収集されますが、ほとんどの監査イベントは退屈で重要ではありません。 監査証跡を調査して対象のイベントを見つけるプロセスは非常に難しく、自動化することが必要になります。
監査構成ファイル/etc/audit/auditd.conf
では、データ保持ポリシー、監査ボリュームの最大サイズ、監査ボリュームの容量を超えた場合にとるべき措置、およびローカルおよびリモートの監査証跡ボリュームの場所を定義します。 デフォルトの監査証跡ボリュームは、/var/log/audit/audit.log
です。 詳細は、auditd.conf(5)
マニュアル・ページを参照してください。
監査では、デフォルトで、システム・ログイン、アカウントに対する変更、sudoアクションなどの特定のイベントがキャプチャされます。 詳細なシステム・コール・アクティビティや特定ファイルに対する変更をキャプチャするように、監査を構成することもできます。 カーネル監査デーモン(auditd
)は、イベント・タイプ、タイム・スタンプ、関連付けられているユーザーID、システム・コールの成功または失敗などの、ユーザーが構成したイベントを記録します。
監査ルール・ファイル/etc/audit/audit.rules
のエントリにより、監査対象イベントが決定されます。 各ルールは、auditctlコマンドに渡されるコマンドライン・オプションです。 通常このファイルは、サイトのセキュリティ・ポリシーに合致するように構成する必要があります。
次に、/etc/audit/audit.rules
ファイルで設定できるルールの例を示します。
/etc
ディレクトリ階層のファイルに対するopen
およびtruncate
システム・コールの終了の失敗をすべて記録します。
-a exit,always -S open -S truncate -F /etc -F success=0
UID 10のユーザーによって開かれたすべてのファイルを記録します。
-a exit,always -S open -F uid=10
当初500超のUIDでログインしたユーザーによって書き込まれた、または属性が変更されたすべてのファイルを記録します。
-a exit,always -S open -F auid>=500 -F perm=wa
/etc/sudoers
への書き込みリクエストまたはファイル属性変更アクセス・リクエストを記録して、これらのレコードに文字列sudoers-change
を使用してタグ付けします。
-w /etc/sudoers -p wa -k sudoers-change
/etc
ディレクトリ階層への書き込みリクエストまたはファイル属性変更アクセス・リクエストを記録します。
-w /etc/ -p wa
監査構成の変更後にリブートが必要です。 指定されている場合、このルールは/etc/audit/audit.rules
ファイルの末尾に表示される必要があります。
-e 2
/usr/share/doc/audit-
、およびversion
/stig.rulesauditctl(8)
およびaudit.rules(7)
の各マニュアル・ページに、監査ルールのその他の例が記載されています。
厳格な監査要件を設定すると、パフォーマンス・オーバーヘッドが大きくなり、大量の監査データが生成されます。 一部のサイト・セキュリティ・ポリシーでは、監査ボリュームが容量を超えるためにイベントを記録できない場合は、システムをシャットダウンする必要があることを明文化しています。 一般的に、オーバーフローを防ぎ、バックアップを促進するために、監査データを順番に別個のファイル・システムに置く必要があります。
ausearchコマンドを使用して容易に監査ボリュームで監査レコードを特定できるように、-kオプションを使用して監査レコードをタグ付けできます。 たとえば、文字列sudoers-change
を使用してタグ付けされたレコードを調べるには、次のように入力します。
# ausearch -k sudoers-change
aureportコマンドは、監査データのサマリーを生成します。 aureportを定期的に実行するcron
ジョブを設定して、対象のレポートを生成できます。 たとえば、次のコマンドは、前日の午前0時の1秒後から現在時刻までのすべてのログイン・イベントを示すレポートを生成します。
# aureport -l -i -ts yesterday -te now
詳細は、ausearch(8)
およびaureport(8)
の各マニュアル・ページを参照してください。
4.14 システム・ロギングの構成および使用
ログ・ファイルには、システム、カーネル、サービスおよびアプリケーションについてのメッセージが含まれます。 systemd
の一部であるjournald
ロギング・デーモンは、非永続ジャーナル・ファイルのシステム・メッセージをメモリーと/run/log/journal
ディレクトリに記録します。journald
はメッセージをシステム・ロギング・デーモンrsyslog
に転送します。 /run
内のファイルは揮発性であり、ディレクトリ/var/log/journal
を作成しない場合は再起動後にログ・データが失われます。 journalctlコマンドを使用して、ジャーナル・ログの問合せを実行できます。
詳細は、journalctl(1)
およびsystemd-journald.service(8)
の各マニュアル・ページを参照してください。
rsyslogd
の構成ファイルは/etc/rsyslog.conf
であり、グローバル・ディレクティブ、モジュール・ディレクティブ、およびルールが含まれます。 デフォルトでは、rsyslog
はsyslog
メッセージのみを処理し、アーカイブします。 必要であれば、rsyslog
を構成して、カーネル、ブート、initrd
、stdout
、およびstderr
メッセージを含む、journald
が転送するその他のメッセージをアーカイブできます。
グローバル・ディレクティブは、rsyslogd
デーモンに適用する構成オプションを指定します。 すべての構成ディレクティブは、ドル記号($
)で始まる必要があり、各行で1つのディレクティブのみ指定できます。 次の例では、rsyslog
メッセージ・キューの最大サイズを指定します。
$MainMsgQueueSize 50000
使用可能な構成ディレクティブについては、ファイル/usr/share/doc/rsyslog-
を参照してください。
version-number
/rsyslog_conf_global.html
rsyslog
は、その機能を構成ディレクティブを提供するモジュールから動的にロードできるように設計されています。 モジュールをロードするには、次のディレクティブを指定します。
$ModLoad MODULE_name
モジュールには、次のメイン・カテゴリがあります。
-
入力モジュールは、様々なソースからメッセージを収集します。 入力モジュール名は、常に
im
接頭辞で始まります(例:imfile
およびimrelp
)。 -
フィルタ・モジュールを使用すると、
rsyslogd
は指定されたルールに基づいてメッセージをフィルタ処理できます。 フィルタ・モジュール名は、常にfm
接頭辞で始まります。 -
ライブラリ・モジュールは、その他のロード可能なモジュールに機能を提供します。
rsyslogd
は、必要に応じてライブラリ・モジュールを自動的にロードします。 ライブラリ・モジュールのロードを構成することはできません。 -
出力モジュールは、メッセージをデータベースまたはネットワーク内の他のサーバーに格納する機能、またはそれらを暗号化する機能を提供します。 出力モジュール名は、常に
om
接頭辞で始まります(例:omsnmp
およびomrelp
)。 -
メッセージ変更モジュールは、
rsyslog
メッセージの内容を変更します。 -
パーサー・モジュールを使用すると、
rsyslogd
は受け取ったメッセージの内容を解析できます。 パーサー・モジュール名は、常にpm
接頭辞で始まります。 -
文字列ジェネレータ・モジュールは、メッセージの内容と
rsyslog
のテンプレート機能に基づいて文字列を生成します。 文字列ジェネレータ・モジュール名は、常にsm
接頭辞で始まります。
入力モジュールはメッセージを受け取って、それらを1つ以上のパーサー・モジュールに渡します。 パーサー・モジュールはメモリー内にメッセージの表現を作成し、メッセージを変更して、内部表現を出力モジュールに渡します。出力モジュールも、メッセージを出力する前にコンテンツを変更できます。
使用可能なモジュールの説明は、RSyslogドキュメント(https://www.rsyslog.com/doc/)を参照してください。
rsyslog
ルールは、メッセージのサブセットを選択するフィルタ・パートと、選択したメッセージの処理を指定するアクション・パートで構成されます。 /etc/rsyslog.conf
構成ファイルでルールを定義するには、1つ以上のタブまたはスペースで区切って、単一行でフィルタとアクションを指定します。
様々なプロパティに従ってメッセージをフィルタ処理するように、rsyslog
を構成できます。 最も一般的に使用されるフィルタは次のとおりです。
-
式ベースのフィルタ。
rsyslog
スクリプト言語で記述され、算術、ブールまたは文字列値に基づいてメッセージを選択します。 -
ファシリティ/優先度ベースのフィルタは、
というフォームをとるファシリティと優先度の値に基づいてメッセージをフィルタ処理します。facility
.priority
-
プロパティ・ベースのフィルタは、
timegenerated
またはsyslogtag
などのプロパティによってメッセージをフィルタ処理します。
次の表に、ファシリティ/優先度ベースのフィルタに使用可能なファシリティ・キーワードを示します。
ファシリティ・キーワード |
説明 |
---|---|
|
セキュリティ、認証または認可メッセージ。 |
|
|
|
|
|
カーネル・メッセージ。 |
|
ライン・プリンタ・サブシステム。 |
|
メール・システム。 |
|
ネットワーク・ニュース・サブシステム。 |
|
|
|
ユーザー・レベル・メッセージ。 |
|
UUCPサブシステム。 |
|
ローカルで使用。 |
次の表に、ファシリティ/優先度ベースのフィルタに使用可能な優先度キーワードを、重要性の低い順に示します。
優先度キーワード |
説明 |
---|---|
|
デバッグ・レベルのメッセージ。 |
|
情報メッセージ。 |
|
正常だが重要な条件。 |
|
警告の状態。 |
|
エラーの状態。 |
|
クリティカルな状態。 |
|
即時に措置が必要です。 |
|
システムは不安定です。 |
指定された優先度以上のすべてのメッセージが、指定されたアクションに基づいて記録されます。 アスタリスク(*
)ワイルドカードは、すべてのファシリティまたは優先度を指定します。 1行に複数のファシリティおよび優先度の名前がある場合は、カンマ(,
)で区切ります。 1行に複数のフィルタがある場合は、セミコロン(;)で区切ります。 ある優先度以外のすべてのメッセージを選択するには、その優先度の前に感嘆符(!
)を付けます。
次に、ファシリティ/優先度ベースのフィルタの例を示します。
任意の優先度のすべてのカーネル・メッセージを選択します。
kern.*
crit
またはそれ以上の優先度を持つすべてのメール・メッセージを選択します。
mail.crit
warning
またはerr
優先度を持つ、すべてのdaemon
およびkern
メッセージを選択します。
daemon,kern.warning,err
info
またはdebug
優先度を持つメッセージを除く、すべてのcron
メッセージを選択します。
cron.!info,!debug
デフォルトでは、/etc/rsyslog.conf
には次のルールが含まれます。
# Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log
次のエントリを各ログ・クライアントの/etc/rsyslog.conf
のforwarding rules
セクションに追加することで、TCP経由でログを集中ログ・サーバーに送信できます。
*.* @@logsvr
:port
前述の例では、logsvr
はログ・サーバーのドメイン名またはIPアドレスであり、portはポート番号です(通常は、514)。
ログ・サーバーで、次のエントリ/etc/rsyslog.conf
のMODULES
セクションに追加します。
$ModLoad imtcp
$InputTCPServerRun port
前述の例では、port
は、ログ・クライアントで設定したポート番号に対応しています。
収集ログのローテーションとアーカイブを管理するには、/etc/rsyslog.conf
のRULES
セクションで定義した各ログ・ファイルを参照するよう/etc/logrotate.d/syslog
を編集します。 /etc/logrotate.conf
を編集して、ログのローテーション頻度およびアーカイブするログの過去のコピー数を構成できます。
ログ・サーバーでLogwatchを構成して、不審なメッセージのログを監視し、ログ・クライアントでLogwatchを無効にすることをお薦めします。 ただし、Logwatchを使用する場合は、次のエントリを各システムの/etc/rsyslog.conf
のGLOBAL DIRECTIVESセクションに追加して、高精度タイムスタンプを無効にします。
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
詳細は、logrotate(8)
、logwatch(8)
、rsyslogd(8)
およびrsyslog.conf(5)
マニュアル・ページ、/usr/share/doc/rsyslog-5.8.10
ディレクトリにあるHTMLドキュメント、およびhttps://www.rsyslog.com/doc/にあるドキュメントを参照してください。
4.14.1 Logwatchの構成
Logwatchは、システム・ログ内の対象分野に関してレポートするように構成できる監視システムです。 logwatch
パッケージをインストールすると、/etc/cron.daily/0logwatch
スクリプトが毎晩実行され、電子メール・レポートがroot
に送信されます。 /etc/logwatch/conf/logwatch.conf
の次のローカル構成オプションを設定して、次の含むメイン構成ファイル/usr/share/logwatch/default.conf/logwatch.conf
をオーバーライドできます。
-
監視対象のログ・ファイル(他のホスト用に格納されたログ・ファイルを含む)。
-
監視対象のサービス、または監視対象から除外するサービスの名前。
-
レポートする詳細のレベル。
-
電子メール・レポートの送信先のユーザー。
logwatchはコマンドラインから直接実行することもできます。
詳細は、logwatch(8)
マニュアル・ページを参照してください。
4.15 プロセス・アカウンティングの構成および使用
psacct
パッケージは、プロセス・アクティビティの監視に使用できる次のユーティリティとともに、プロセス・アカウンティング・サービスを実装します。
- ac
-
wtmp
ファイルに記録されているとおりに、ユーザーの接続時間を時間単位で表示します(デフォルトでは、/var/log/wtmp
)。 - accton
-
指定したファイルに対してプロセス・アカウンティングをオンにします。 ファイル名引数を指定しないと、プロセス・アカウンティングは停止されます。 デフォルトのシステム・アカウンティング・ファイルは
/var/account/pacct
です。 - lastcomm
-
システム・アカウンティング・ファイルに記録されているとおりに、前に実行されたコマンドの情報を表示します。
- sa
-
システム・アカウンティング・ファイルに記録されているとおりに、前に実行されたコマンドの情報を要約します。
ロギング・アクティビティでは、ファイル・システムにシステム・アカウンティング・ファイルおよびwtmp
ファイルを格納するための十分な領域があることを確認してください。 ファイルのサイズを監視し、必要に応じて切り捨てます。
詳細は、ac(1)
、 accton(8)
、lastcomm(1)
およびsa(8)
の各マニュアル・ページを参照してください。
4.16 Linux Containersの構成および使用
Linux Containers (LXC)機能では、プロセスのグループを、Oracle Linuxシステムで実行されている他のプロセスから隔離する方法が提供されます。 LXCは、コントロール・グループ(cgroup)機能を使用してchrootと同じ方法でリソース管理およびネームスペース隔離を可能にする軽量オペレーティング・システム仮想化テクノロジです。 コンテナ内で、プロセスはオペレーティング・システムとその独自のプロセスID空間、ファイル・システム構造、ネットワーク・インタフェースの独自のプライベート・ビューを持つことができます。
以下のドキュメントを参照してください。
-
Linux Containersの構成方法と使用方法の詳細は、Oracle® Linux 7: LXCの使用を参照してください。
-
Oracle Cloud Native Environmentドキュメント(https://docs.oracle.com/en/operating-systems/olcne/)を参照してください。
4.17 カーネル・セキュリティ・メカニズムの構成および使用
Linuxカーネルには、システムのセキュリティの強化に使用できる、いくつかのセキュリティ・メカニズムが搭載されています。 これらのメカニズムにより、プロセスのアドレス空間の配置をランダム化したり、実行不可能なメモリー内でコードが実行されるのを防ぎます。
4.17.1 アドレス空間配置のランダム化
アドレス空間配置のランダム化(ASLR)は、特定のタイプのバッファ・オーバーフロー攻撃を撃退するのに役立ちます。 ASLRでは、ベース、ライブラリ、ヒープ、スタックをプロセスのアドレス空間のランダムな位置に配置します。これにより、攻撃プログラムは次の命令のメモリー・アドレスを予測することが困難になります。 ASLRはLinuxカーネルに組み込まれており、パラメータ/proc/sys/kernel/randomize_va_space
によって制御されます。 randomize_va_space
パラメータは、次の値をとることができます。
- 0
-
ASLRを無効化します。 この設定は、カーネルが
norandmaps
ブート・パラメータでブートされる場合に適用されます。 - 1
-
スタック、仮想動的共有オブジェクト(VDSO)ページ、共有メモリー領域の位置をランダム化します。 データ・セグメントのベース・アドレスは、実行可能コード・セグメントの末尾の直後に配置されます。
- 2
-
スタック、VDSOページ、共有メモリー領域およびデータ・セグメントの位置をランダム化します。 これがデフォルトの設定です。
次のように、新しい値を/proc/sys/kernel/randomize_va_space
に書き込むことで、設定を一時的に変更できます。
# echo value
> /proc/sys/kernel/randomize_va_space
値を完全に変更するには、次のように設定を/etc/sysctl.conf
に追加します。
kernel.randomize_va_space = value
その後、sysctl -pコマンドを実行します。
randomize_va_space
の値を変更する場合は、アプリケーション・スタックをテストして、新しい設定と互換性があることを確認する必要があります。
必要に応じて、次のコマンドを使用して、特定のプログラムとその子プロセスに対してASLRを無効にできます。
% setarch `uname -m` -R program
[args
...]
4.17.2 データ実行防止
データ実行防止(DEP)機能は、アプリケーションまたはサービスが実行不可能なメモリー領域でコードを実行することを防ぎます ハードウェア強制DEPはNX (Never eXecute)ビットとともに、互換性のあるCPU上で機能します。 Oracle Linuxでは、ハードウェアにNXビットを実装していないCPUのために、ソフトウェアでNXビットをエミュレートすることはありません。
DEP機能は無効化できません。
4.17.3 位置独立実行形式
位置独立実行形式(PIE)機能では、カーネルがテキストを再配置できないように、ランダム・メモリー・アドレスで実行可能バイナリをロードします。 位置独立バイナリを生成するには:
-
コンパイル時に、gccに-fpieオプションを設定します。
-
リンク時にldに-pieオプションを設定します。
バイナリまたはライブラリを再配置できるかどうかをテストするには、次のコマンドを使用します。
# readelf -d elfname
| grep TEXTREL