機械翻訳について

第4章 Oracle Linuxセキュリティの実装

この章では、Oracle Linuxシステムのセキュリティを構成する様々な方法について説明します。

4.1 ネットワーク・サービスへのアクセスの構成

ネットワークは一般にITシステムへのプライマリ・エントリ・ポイントであり、ネットワーク侵入防止および検出ツールを使用してセキュリティ侵害を阻止または検出できます。 その後、未使用のネットワーク・サーバーの無効化やパケットフィルタリング・ファイアウォールおよびTCPラッパーの構成などのステップをとることができます。

パケットのロギングおよび分析を実行するために、いくつかのオープンソース・ツールを利用できます。 たとえば、tcpdumpやSnortはTCPトラフィックをキャプチャして、一般にポート・スキャンやネットワークDos攻撃などで発生する不審な使用パターンを分析します。 Sguilにはtcpdump、SnortおよびWiresharkプロトコル・アナライザが組み込まれており、ログの分析およびレポートを簡易化するネットワーク侵入および検出システムが提供されています。

ポート・スキャン・ユーティリティを使用して、システムで実行されているサービスを確認できます。 次の例は、netstatlsofおよび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を示します。

図4.1 ファイアウォール構成


コマンドラインからファイアウォール構成を作成または変更するには、firewall-cmdユーティリティ(あるいは、必要であればiptablesまたはip6tablesユーティリティ)を使用してパケット・フィルタイリング・ルールを構成します。

パケット・フィルタリング・ルールはfirewalldに関しては/etc/firewalld階層、およびiptablesip6tablesに関しては/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_listclient_listはデーモンとクライアントのカンマ区切りリストであり、クライアントがデーモンにアクセスしようとすると、オプションのcommandが実行されています。 すべてのデーモンまたはすべてのクライアントを表すには、キーワードALLを使用します。 サブネットは、*ワイルドカードを使用して表します(例: 192.168.2.*)。 ドメインは、ドメイン名にピリオド(.)の接頭辞を付けて表します(例: .mydomain.com)。 オプションのdenyキーワードを付けると、/etc/hosts.allowファイルで指定されているルールの場合でも接続が拒否されます。

次に、ルールの例をいくつか示します。

すべてのクライアントのscpsftpおよびsshアクセス(sshd)を照合します。

sshd : ALL

192.168.2サブネット上のすべてのクライアントのFTPアクセス(vsftpd)を照合します。

vsftpd : 192.168.2.*

mydomain.comドメイン内のすべてのクライアントに一致し、ラップされたすべてのサービスへのアクセスを取得します。

ALL : .mydomain.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

scpsftpおよびsshアクセスのすべてのクライアントと一致し、イベントをemergメッセージとして記録します。このメッセージは、コンソールに表示されます。

sshd : ALL : severity emerg

scpsftp、およびsshアクセスのためにforbid.comドメインのすべてのクライアントと一致させるには、イベントをログに記録し、アクセスを拒否します(ルールが/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 Jailsを使用したルート(/)ディレクトリの保護

chroot操作は、実行中のプロセスとその子の目に見えるルート・ディレクトリを変更します。 この操作により、/以外のルート・ディレクトリでプログラムを実行できます。 プログラムからは指定されたディレクトリ・ツリー外のファイルは見えず、アクセスもできません。 このような人為的なルート・ディレクトリをchroot jailと呼びます。その目的は、攻撃者のディレクトリへのアクセスを制限することです。 Chroot jailにより、指定されたプロセスおよびプロセスで使用されているユーザーIDがロックダウンされるため、これらのプロセスおよびユーザーIDにはプロセスを実行中のディレクトリしか見えません。 プロセスにとっては、実行中のディレクトリがルート・ディレクトリとなります。

ノート

chrootメカニズムでは、意図的な改ざんや特権ユーザーによるシステム・デバイスへの低レベルのアクセスを防ぐことはできません。 たとえば、chroot rootユーザーはデバイス・ノードを作成し、その上にファイル・システムをマウントできます。 また、root権限を取得し、chroot()を使用して現在の作業ディレクトリを実際のrootディレクトリに変更できた場合、プログラムはchroot jailから脱出できます。 このため、chroot jailにrootが所有するsetuidsetgid実行可能ファイルが含まれていないことを確認する必要があります。

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を作成するには:

  1. Chroot jailのルート・ディレクトリとなるディレクトリを作成します。次に例を示します。

    # mkdir /home/oracle/jail

  2. 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内で再作成する必要があります。

  3. chroot jailのルート・ディレクトリのサブディレクトリを作成します。このサブディレクトリの相対パスは、コマンド・バイナリとその必須ライブラリの実際のルート・ディレクトリからの相対パスと同じです。例を示します。

    # mkdir -p /home/oracle/jail/usr/bin
    # mkdir -p /home/oracle/jail/usr/lib64

  4. バイナリおよびライブラリ・ディレクトリにリンクするシンボリック・リンクは、実際のルート・ディレクトリに存在するシンボリック・リンクと同じ方法で作成します。

    # ln -s /home/oracle/jail/usr/bin /home/oracle/jail/bin
    # ln -s /home/oracle/jail/usr/lib64 /home/oracle/jail/lib64
  5. バイナリと共有ライブラリを、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

コマンド引数が指定されていない場合、chrootSHELL環境変数の値を実行し、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コマンドの出力での文字コードの意味を示します。

コード

差異の説明

5

MD5サム。

D

デバイスのメジャーまたはマイナー番号。

G

グループの所有権。

L

シンボリック・リンク・パス。

M

権限またはファイル・タイプを含むモード。

P

機能。

S

ファイル・サイズ。

T

変更時刻。

U

ユーザーの所有権。

.

なし(テストに合格)。

?

不明(テストを実行できなかった)。

影響を受けるファイルの前に1文字のコードが表示される場合は、ファイル・タイプを示し、次の表に示す値を使用できます。

コード

説明

c

構成ファイル。

d

ドキュメント・ファイル。

g

ファイルの内容がパッケージ・ペイロードに含まれないゴースト・ファイル。

l

ライセンス・ファイル。

r

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コマンドを使用して、システムで使用可能なすべてのerrataのリスト(セキュリティ更新を含む)を取得できます。 さらに、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)のいずれであるかが指定されます。 セキュリティ・パッチは、重大度(ImportantModerateまたは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
...

同様に、キーワードbugfixenhancementおよび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の構成および使用

プラガブル認証モジュール(PAM)機能は、アプリケーションがユーザー資格証明を検証するための認証メカニズムです。 詳細は、Oracle® Linux 7: システム・アカウントおよび認証の設定を参照してください。

4.11 アクセス制御リストの構成および使用

POSIXアクセス制御リスト(ACL)は、所有者、グループおよび他のすべてのシステム・ユーザーの読取り、書込み、実行権限を設定する従来のUNIX任意アクセス制御(DAC)よりも豊富なアクセス制御モデルを提供します。 複数のユーザーまたはグループのアクセス権を定義し、プログラム、プロセス、ファイル、ディレクトリの権限を指定するACLを構成できます。 ディレクトリにデフォルトのACLを設定すると、その子孫が同じ権限を自動的に継承します。 カーネルは、ext3ext4および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.rules、およびauditctl(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であり、グローバル・ディレクティブ、モジュール・ディレクティブ、およびルールが含まれます。 デフォルトでは、rsyslogsyslogメッセージのみを処理し、アーカイブします。 必要であれば、rsyslogを構成して、カーネル、ブート、initrdstdout、および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つ以上のパーサー・モジュールに渡します。 パーサー・モジュールはメモリー内にメッセージの表現を作成し、メッセージを変更して、内部表現を出力モジュールに渡します。出力モジュールも、メッセージを出力する前にコンテンツを変更できます。

使用可能なモジュールの説明は、https://www.rsyslog.com/doc/のRSyslogドキュメントを参照してください。

rsyslogルールは、メッセージのサブセットを選択するフィルタ・パートと、選択したメッセージの処理を指定するアクション・パートで構成されます。 /etc/rsyslog.conf構成ファイルでルールを定義するには、1つ以上のタブまたはスペースで区切って、単一行でフィルタとアクションを指定します。

様々なプロパティに従ってメッセージをフィルタ処理するように、rsyslogを構成できます。 最も一般的に使用されるフィルタは次のとおりです。

  • 式ベースのフィルタ。rsyslogスクリプト言語で記述され、算術、ブールまたは文字列値に基づいてメッセージを選択します。

  • ファシリティ/優先度ベースのフィルタは、facility.priorityというフォームをとるファシリティと優先度の値に基づいてメッセージをフィルタ処理します。

  • プロパティ・ベースのフィルタは、timegeneratedまたはsyslogtagなどのプロパティによってメッセージをフィルタ処理します。

次の表に、ファシリティ/優先度ベースのフィルタに使用可能なファシリティ・キーワードを示します。

ファシリティ・キーワード

説明

authauthpriv

セキュリティ、認証または認可メッセージ。

cron

crondメッセージ。

daemon

crondおよびrsyslogd以外のシステム・デーモンからのメッセージ。

kern

カーネル・メッセージ。

lpr

ライン・プリンタ・サブシステム。

mail

メール・システム。

news

ネットワーク・ニュース・サブシステム。

syslog

rsyslogdによって内部で生成されたメッセージ。

user

ユーザー・レベル・メッセージ。

UUCP

UUCPサブシステム。

local0 - local7

ローカルで使用。

次の表に、ファシリティ/優先度ベースのフィルタに使用可能な優先度キーワードを、重要性の低い順に示します。

優先度キーワード

説明

debug

デバッグ・レベルのメッセージ。

info

情報メッセージ。

notice

正常だが重要な条件。

warning

警告条件。

err

エラー条件。

crit

クリティカル条件。

alert

即時に措置が必要です。

emerg

システムは不安定です。

指定された優先度以上のすべてのメッセージが、指定されたアクションに基づいて記録されます。 アスタリスク(*)ワイルドカードは、すべてのファシリティまたは優先度を指定します。 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.confforwarding rulesセクションに追加することで、TCP経由でログを集中ログ・サーバーに送信できます。

*.*        @@logsvr:port

前述の例では、logsvrはログ・サーバーのドメイン名またはIPアドレス、ポートはポート番号(通常は514)です。

ログ・サーバーで、次のエントリ/etc/rsyslog.confMODULESセクションに追加します。

$ModLoad imtcp
$InputTCPServerRun port

前述の例では、portは、ログ・クライアントで設定したポート番号に対応します。

収集ログのローテーションとアーカイブを管理するには、/etc/rsyslog.confRULESセクションで定義した各ログ・ファイルを参照するよう/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空間、ファイル・システム構造、ネットワーク・インタフェースの独自のプライベート・ビューを持つことができます。

以下のドキュメントを参照してください。

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