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

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

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

ネットワークは一般に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つの項では、ネットワーク・サービスへのアクセスを制限するための具体的な方法を示します。

パケット・フィルタリング・ファイアウォールの構成

パケット・フィルタリング・ファイアウォールは、パケットのヘッダー情報に基づいて、受信および送信ネットワーク・パケットをフィルタ処理します。パケットを受け入れるか拒否するかを決定するパケット・フィルタ・ルールを作成できます。たとえば、ポートをブロックするルールを作成した場合、そのポートに対するリクエストはすべてファイアウォールでブロックされ、リクエストは無視されます。ブロックされたポートでリスニングしているサービスはすべて、事実上無効化されます。

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 ファイアウォール構成


この図は、ファイアウォール構成GUIを示しています。

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

パケット・フィルタリング・ルールはfirewalldに関しては/etc/firewalld階層に、iptablesip6tablesに関しては/etc/sysconfig/iptables/etc/sysconfig/ip6tablesファイルに記録されます。

firewalldファイアウォール・サービスの制御

firewalldサービスはOracle Linux 7でデフォルトで有効化されています。systemctlコマンドを使用してサービスを開始、停止、再起動し、そのステータスの問合せを実行できます。

firewalldゾーンの構成

システムのファイアウォールが構成されているゾーンをチェックするには:

sudo firewall-cmd --get-active-zone

システムがゾーンに割り当てられていない場合は、コマンドに結果が表示されません。

次のコマンドを使用して、使用可能なゾーンをすべて表示します。

sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work

em1インタフェースを介して接続されているローカル・ネットワーク上でworkゾーンのシステムを構成するには:

sudo firewall-cmd --zone=work --change-interface=em1
success

現在のゾーンのクエリを実行すると、ファイアウォールがworkゾーンのインタフェースem1に構成されていることが表示されます。

sudo firewall-cmd --get-active-zone
work
  interfaces: em1

永続的に変更するには、次のようにシステムのデフォルト・ゾーンを変更できます。

sudo firewall-cmd --get-default-zone
public
sudo firewall-cmd --set-default-zone=work
success
sudo firewall-cmd --get-default-zone
work
サービスへのアクセスの制御

サービスへのアクセスは、名前を指定すると許可または拒否できます。次のコマンドは、workゾーンのローカル・システム上でアクセスが許可されるサービスをリストします。

sudo firewall-cmd --zone=work --list-services
ssh samba 

この例では、SSHおよびSambaクライアントによるアクセスが許可されます。

workゾーンがアクティブなときにNFSおよびHTTPクライアントによるアクセスを許可するには、--add-serviceオプションを使用します。

sudo firewall-cmd --zone=work --add-service=http --add-service=nfs
success
sudo firewall-cmd --zone=work --list-services
http nfs ssh samba

ノート:

ゾーンを指定しない場合、変更は現在アクティブなゾーンではなく、デフォルトのゾーンに適用されます。

再起動後もルールを維持するには、--permanentオプションを指定してコマンドを再実行します。

sudo firewall-cmd --permanent --zone=work --add-service=http --add-service=nfs
success

サービスへのアクセスを削除するには、次のように--remove-serviceオプションを使用します。

sudo firewall-cmd --zone=work --remove-service=samba
success
sudo firewall-cmd --zone=work --list-services
http nfs ssh
ポートへのアクセスの制御

ポートへのアクセスは、ポート番号と関連するプロトコルを指定すると許可または拒否できます。--list-portオプションは、次のように明示的にアクセスを許可したポートと関連するプロトコルをリストします。

sudo firewall-cmd --zone=work --list-ports
3689/tcp

--add-portオプションを使用すると、アクセスを許可できます。

sudo firewall-cmd --zone=work --add-port=5353/udp
success
sudo firewall-cmd --zone=work --list-ports
5353/udp 3689/tcp

同様に、--remove-portオプションでポートへのアクセスを削除できます。変更内容を維持する場合は--permanentオプションを指定してコマンドを再実行するということを覚えておいてください。

ゾーンに定義されているファイアウォール・ルールをすべて表示するには、--list-allオプションを使用します。

sudo 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)マニュアル・ページを参照してください。

iptablesファイアウォール・サービスの制御

firewalldではなくiptablesを使用する場合、iptablesファイアウォール・サービスを起動し、システムのブート時に開始されるように有効にするには、最初にfirewalldサービスを停止し、無効化します。

sudo systemctl stop firewalld 
sudo systemctl disable firewalld 
sudo systemctl start iptables 
sudo systemctl enable iptables

サービスが次に開始したときにファイアウォール・ルールに加えた変更をロードするように、変更内容を/etc/sysconfig/iptablesに保存するには、次のようにします。

sudo /sbin/iptables-save > /etc/sysconfig/iptables

/etc/sysconfig/iptablesからルールが再度読み取られるようにサービスを再起動するには:

sudo systemctl restart iptables

サービスを停止するには:

sudo systemctl stop iptables

IPv6フィルタリングを制御するには、iptablesではなくip6tablesを使用します。

詳細は、iptables(8),およびip6tables(8)の各マニュアル・ページを参照してください。

iptablesおよびip6tablesで使用されるnetfilterテーブルについて

iptablesおよびip6tablesで使用されるnetfilterテーブルには、次が含まれます。

Filter

デフォルトのテーブルで、主にコンテンツに基づいてパケットを削除または受け入れるために使用されます。

Mangle

このテーブルは、パケット内の特定フィールドを変更するために使用されます。

NAT

ネットワーク・アドレス変換テーブルは、新規接続を作成するパケットのルーティングに使用されます。

カーネルは、これらのテーブルに格納されているルールを使用して、ネットワーク・パッケージ・フィルタリングに関する決定を行います。各ルールは、1つ以上の条件と1つのアクションで構成されます。ルールの条件とネットワーク・パケット・ヘッダーの情報が一致した場合、カーネルはパケットにアクションを適用します。アクションの例を次に示します。
ACCEPT

パケットの処理を続行します。

DROP

通知なしでパケットの寿命を終了します。

REJECT

DROPと同じですが、さらにパケットがブロックされたことを送信システムに通知します。

ルールはチェーンに格納され、各チェーンはデフォルト・ポリシーとゼロ以上のルールで構成されます。カーネルは一致が見つかるまで、チェーン内の各ルールをパケットに適用します。一致するルールがない場合、カーネルはチェーンのデフォルト・アクション(ポリシー)をパケットに適用します。

netfilterテーブルにはそれぞれ、複数の事前定義済チェーンがあります。filterテーブルには、次のチェーンが含まれます。
FORWARD

ローカル・システム宛てでないパケットは、このチェーンを通過します。

INPUT

ローカル・システム宛てのインバウンド・パケットは、このチェーンを通過します。

OUTPUT

ローカルで作成されたパケットは、このチェーンを通過します。

チェーンは永続的であり、削除できません。ただし、フィルタ・テーブルに追加のチェーンを作成することはできます。

ファイアウォール・ルールのリスト
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
チェーンに対するルールの挿入および置換
チェーンにルールを挿入するには、iptables -Iコマンドを使用します。たとえば、次のコマンドはINPUTチェーンにルールを挿入して、ポート80でのTCPによるアクセスを許可します。
sudo iptables -I INPUT 4 -p tcp -m tcp --dport 80 -j ACCEPT
sudo 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によるアクセスを許可します。

sudo iptables -I INPUT 4 -p tcp -m tcp --dport 443 -j ACCEPT
sudo 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
チェーンでのルールの削除
チェーンでルールを削除するには、iptables -Dコマンドを使用します。たとえば、次のコマンドはINPUTチェーンからルール4を削除します。
sudo iptables -D INPUT 4

1つのチェーン内のすべてのルールを削除するには、次のように入力します。

sudo iptables -F chain

すべてのチェーン内のすべてのルールを削除するには、次のように入力します。

sudo iptables -F
ルールの保存

iptablesサービスが次に開始したときに変更が加えられたファイアウォール・ルールがロードされるように、変更内容を保存するには、次のコマンドを使用します。

sudo /sbin/iptables-save /etc/sysconfig/iptables

このコマンドはルールを/etc/sysconfig/iptablesに保存します。IPv6の場合、/sbin/ip6tables-save > /etc/sysconfig/ip6tablesを使用してルールを/etc/sysconfig/ip6tablesに保存できます。

OpenSSHの構成

OpenSSHは、システム間のセキュアな通信を提供する、ネットワーク接続ツールのスイートです。OpenSSHにより、ネットワーク・トラフィックが外部の脅威を受けないようにすることで、お客様の組織をもう一段階保護します。詳細は、『Oracle® Linux: OpenSSHを使用したリモート・システムへの接続』を参照してください。

TCPラッパーの構成

TCPラッパーは、受信ネットワーク・トラフィックの基本的なフィルタリングを提供します。他のシステムからLinuxサーバー上で実行されている特定のwrappedネットワーク・サービスへのアクセスを、許可または拒否します。ラップされたネットワーク・サービスとは、libwrap.aライブラリに対してコンパイルされたサービスです。sshdデーモンの次の例に示されているように、lddコマンドを使用してネットワーク・サービスがラップされているかどうかを確認できます。
sudo 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ファイルで指定されているルールの場合でも接続が拒否されます。

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

すべてのクライアントのscpsftpおよび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
すべてのクライアントのscpsftpおよびsshアクセスを照合し、イベントをemergメッセージとしてログに記録します。このメッセージはコンソールに表示されます。
sshd : ALL : severity emerg
forbid.comドメイン内のすべてのクライアントのscpsftpおよび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)マニュアル・ページを参照してください。

chroot jailの使用によるルート(/)ディレクトリの保護

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

ノート:

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

chrootプロセスを正常に開始するには、chrootディレクトリに必要なすべてのプログラム・ファイル、構成ファイル、デバイス・ノード、共有ライブラリを移入する必要があります。それぞれを、chrootディレクトリのレベルに対して相対的な、予期される場所に移入します。

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オプションを指定します。

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

Chroot Jailの使用

既存のディレクトリのchroot jailでコマンドを実行するには(chroot_jail)、次のコマンドを使用します。

chroot chroot_jail command

コマンド引数が指定されていない場合、chrootSHELL環境変数の値を実行し、SHELLが設定されていない場合は/usr/bin/shを実行します。

たとえば、chroot jailで/usr/bin/bashを実行する場合(「Chroot Jailの作成」の説明に従って前もって設定)は、次のようになります。

chroot /home/oracle/jail 
bash-4.2# pwd
/
bash-4.2# ls
bash: ls: command not found
bash-4.2# exit
#

このシェルでpwdなどの組込みのシェル・コマンドを実行することはできますが、バイナリおよび必要な共有ライブラリをchroot jailにコピーしないかぎり、他のコマンドは実行できません。

詳細は、chroot(1)マニュアル・ページを参照してください。

ソフトウェア管理の構成および使用

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: ユーザーの所有権。

  • .: なし(テストに合格)。

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

影響を受けたファイルの前に単一の文字コードが表示されている場合、これはファイルのタイプを示し、次のリストに示す値をとります。

  • c: 構成ファイル。

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

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

  • l: ライセンス・ファイル。

  • r: Readmeファイル

差異の多くは、サブシステムの構成ファイルを編集したことによるものです。一定期間に変更されたファイルを確認するには、インストール後ただちに差異のベースライン・ファイルを作成し、このファイルと後からrpm -Vによって見つかった結果との差分(diff)を検出します。

ファイル整合性チェッカーを使用して、システムか損われているかどうかをテストすることもできます。AIDE (Advanced Intrusion Detection Environment)やTripwireなど、いくつかのオープン・ソースおよび商用ファイル整合性チェック・ツールを利用できます。AIDEおよびTripwireは、ファイル・システムをスキャンして、各ファイルの暗号化ハッシュをデータベースに記録する侵入検出システムです。データベースの作成後、データベースを読取り専用メディアに移動して、改ざんされるのを防ぐ必要があります。その後のファイル・システム・チェックでは、保存されているチェックサムが現在のファイルのチェックサムと一致しない場合、ツールによって警告されます。詳細は、AIDEまたはTripwireのWebサイトを参照してください。

詳細は、yum(8)マニュアル・ページを参照してください。

更新およびパッチ管理の構成

効果的なセキュリティプラクティスを実現するには、システム・ソフトウェアを最新に保つことが大切です。このため、システム・セキュリティ・アップデートが発行されたらすぐに適用する必要があります。すべての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を参照してください。

Yumセキュリティ・プラグインのインストールおよび使用

yum-plugin-securityパッケージにより、yumコマンドを使用して、ご使用のシステム用に提供されているすべての更新情報(セキュリティ更新など)のリストを取得できるようになります。さらに、Oracle Enterprise Manager 12c Cloud Controlや管理ツール(Katello、Pulp、Red Hat Satellite、Spacewalk、SUSE Managerなど)を使用して、更新情報を抽出および表示できます。

yum-plugin-securityパッケージをインストールするには、次のコマンドを入力します。
sudo yum install yum-plugin-security

システムで利用できる更新情報をリストするには、次のように入力します。

sudo 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オプションを使用すると、セキュリティ更新情報を重大度でフィルタ処理できます。

sudo 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を引数として指定します。

sudo 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に対応する更新情報を表示できます。

sudo 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を指定します。
sudo 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
セキュリティ関連の更新情報が利用可能なすべてのパッケージを最新バージョンのパッケージ(パッケージにバグ修正または新機能が含まれるがセキュリティ更新情報は含まれない場合でも)に更新するには、次のように入力します。
sudo yum --security update 
すべてのパッケージを、セキュリティ更新情報が含まれる最新バージョン(セキュリティ更新情報が含まれない新しいパッケージは対象外)に更新するには、次のように入力します。
sudo yum --security update-minimal

すべてのカーネル・パッケージを、セキュリティ更新情報が含まれる最新バージョンに更新するには、次のように入力します。

sudo yum --security update-minimal kernel* 

また、1つのCVEまたは更新情報に対応するパッケージのみを更新することもできます。たとえば:

yum update --cve CVE-2012-3954
sudo yum update --advisory ELSA-2012-1141

ノート:

一部の更新ではシステムを再起動する必要があります。デフォルトでは、ブート・マネージャによって最新のカーネル・バージョンが自動的に有効化されます。

詳細は、yum-security(8)マニュアル・ページを参照してください。

データ暗号化の構成および使用

データ暗号化を使用して、保存されているデータまたは転送されるデータを保護できます。ストレージ・デバイスおよびメディア上のデータは、漏えいするリスクまたはデバイスが紛失するリスクがあります。ローカル・エリア・ネットワークおよびインターネットで転送されるデータは、インターセプトまたは変更される可能性があります。また、プライバシ・データおよび個人データを保護するデータ暗号化はますます、企業のセキュリティ・ポリシーおよび政府規制(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で、ハードウェア・アクセラレーション暗号化を利用します。

証明書管理の構成および使用

公開キー・インフラストラクチャ(PKI)では、ネットワーク接続を暗号化および検証するためのツールとフレームワークが提供されます。また、署名付き証明書の形式での認証メカニズムも提供されます。証明書の管理と強力な公開キー・インフラストラクチャの実装は、お客様の組織内で優れたセキュリティを維持するための重要部分です。詳細は、『Oracle® Linux: 証明書と公開キー・インフラストラクチャの管理』を参照してください

認証の構成および使用

認証とは、ユーザーのアイデンティティを検証する方法です。オペレーティング・システムにより、システムに格納されているデータとこの情報を比較することでユーザー名とパスワードが認証されます。ログイン資格証明がそのデータと一致する場合は、システムへのアクセス権が付与されます。詳細は、『Oracle® Linux 7: システム・アカウントおよび認証の設定』を参照してください。

Pluggable Authentication Moduleの構成および使用

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

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

POSIXアクセス制御リスト(ACL)は、所有者、グループおよび他のすべてのシステム・ユーザーの読取り、書込み、実行権限を設定する従来のUNIX任意アクセス制御(DAC)よりも豊富なアクセス制御モデルを提供します。複数のユーザーまたはグループのアクセス権を定義し、プログラム、プロセス、ファイル、ディレクトリの権限を指定するACLを構成できます。ディレクトリにデフォルトのACLを設定すると、その子孫が同じ権限を自動的に継承します。カーネルは、ext3ext4およびNFSエクスポート・ファイル・システムにACLサポートを提供します。

次に、ディレクトリおよびファイルのACLを設定および表示する例を示します。

ユーザーにファイルまたはディレクトリへの読取りアクセス権を付与します。
sudo setfacl -m u:user:r file
ファイルまたはディレクトリの名前、所有者、グループおよびACLを表示します。
sudo getfacl file
ACLではなく有効な権限マスクを変更して、すべてのグループおよびユーザーのファイルへの読取りアクセスを削除します。
sudo setfacl -m m::rx file
ファイルのACLからグループのエントリを削除します。
sudo setfacl -x g:group file
ファイルf1のACLをファイルf2にコピーします。
sudo getfacl f1 | setfacl --set-file=- f2
ディレクトリのACL設定を、継承可能なデフォルトのACL設定に昇格させます。
sudo getfacl --access dir | setfacl -d -M- dir

ACLの管理方法の詳細は、setfacl(1)およびgetfacl(1)マニュアル・ページを参照してください。

SELinuxの構成と使用

SELinuxは、Oracle Linuxシステムにアクセス制御ポリシーを適用および実装して、悪意のあるアクセスや不正アクセスからサービスおよびファイルを保護するカーネル・モジュールです。ポリシーの管理およびアクセスの問題の解決には、SELinuxユーザー空間ツールを使用します。詳細は、『Oracle® Linux: SELinuxの管理』を参照してください

監査の構成および使用

監査では、分析可能なカーネル・レベルでデータを収集して、不正なアクティビティを識別します。監査では、システム・ロギングよりもはるかに詳細なデータが数多く収集されますが、ほとんどの監査イベントは退屈で重要ではありません。監査証跡を調査して対象のイベントを見つけるプロセスは非常に難しく、自動化することが必要になります。

監査構成ファイル/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を使用してタグ付けされたレコードを調べるには、次のように入力します。

sudo ausearch -k sudoers-change

aureportコマンドは、監査データのサマリーを生成します。aureportを定期的に実行するcronジョブを設定して、対象のレポートを生成できます。たとえば、次のコマンドは、前日の午前0時の1秒後から現在時刻までのすべてのログイン・イベントを示すレポートを生成します。

sudo aureport -l -i -ts yesterday -te now

詳細は、ausearch(8)およびaureport(8)の各マニュアル・ページを参照してください。

システム・ロギングの構成および使用

ログ・ファイルには、システム、カーネル、サービスおよびアプリケーションについてのメッセージが含まれます。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つ以上のパーサー・モジュールに渡します。パーサー・モジュールはメモリー内にメッセージの表現を作成し、メッセージを変更して、内部表現を出力モジュールに渡します。出力モジュールも、メッセージを出力する前にコンテンツを変更できます。

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

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アドレスであり、portはポート番号です(通常は、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/にあるドキュメントを参照してください。

Logwatchの構成

Logwatchは、システム・ログ内の対象分野に関してレポートするように構成できる監視システムです。logwatchパッケージをインストールすると、/etc/cron.daily/0logwatchスクリプトが毎晩実行され、電子メール・レポートがrootに送信されます。/etc/logwatch/conf/logwatch.confの次のローカル構成オプションを設定して、次の含むメイン構成ファイル/usr/share/logwatch/default.conf/logwatch.confをオーバーライドできます。

  • 監視対象のログ・ファイル(他のホスト用に格納されたログ・ファイルを含む)。

  • 監視対象のサービス、または監視対象から除外するサービスの名前。

  • レポートする詳細のレベル。

  • 電子メール・レポートの送信先のユーザー。

logwatchはコマンドラインから直接実行することもできます。

詳細は、logwatch(8)マニュアル・ページを参照してください。

プロセス・アカウンティングの構成および使用

psacctパッケージは、プロセス・アクティビティの監視に使用できる次のユーティリティとともに、プロセス・アカウンティング・サービスを実装します。

ac

wtmpファイルに記録されているとおりに、ユーザーの接続時間を時間単位で表示します(デフォルトでは、/var/log/wtmp)。

accton

指定したファイルに対してプロセス・アカウンティングをオンにします。ファイル名引数を指定しないと、プロセス・アカウンティングは停止されます。デフォルトのシステム・アカウンティング・ファイルは/var/account/pacctです。

lastcomm

システム・アカウンティング・ファイルに記録されているとおりに、前に実行されたコマンドの情報を表示します。

sa

システム・アカウンティング・ファイルに記録されているとおりに、前に実行されたコマンドの情報を要約します。

ノート:

ロギング・アクティビティでは、ファイル・システムにシステム・アカウンティング・ファイルおよびwtmpファイルを格納するための十分な領域があることを確認してください。ファイルのサイズを監視し、必要に応じて切り捨てます。

詳細は、ac(1) accton(8)lastcomm(1)およびsa(8)の各マニュアル・ページを参照してください。

Linux Containersの構成および使用

Linux Containers (LXC)機能では、プロセスのグループを、Oracle Linuxシステムで実行されている他のプロセスから隔離する方法が提供されます。LXCは、コントロール・グループ(cgroup)機能を使用してchrootと同じ方法でリソース管理およびネームスペース隔離を可能にする軽量オペレーティング・システム仮想化テクノロジです。コンテナ内で、プロセスはオペレーティング・システムとその独自のプロセスID空間、ファイル・システム構造、ネットワーク・インタフェースの独自のプライベート・ビューを持つことができます。

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

 カーネル・セキュリティ・メカニズムの構成および使用

Linuxカーネルには、システムのセキュリティの強化に使用できる、いくつかのセキュリティ・メカニズムが搭載されています。これらのメカニズムにより、プロセスのアドレス空間の配置をランダム化したり、実行不可能なメモリー内でコードが実行されるのを防ぎます。

アドレス空間配置のランダム化

アドレス空間配置のランダム化(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 ...]

データ実行防止

データ実行防止(DEP)機能は、アプリケーションまたはサービスが実行不可能なメモリー領域でコードを実行することを防ぎますハードウェア強制DEPはNX (Never eXecute)ビットとともに、互換性のあるCPU上で機能します。Oracle Linuxでは、ハードウェアにNXビットを実装していないCPUのために、ソフトウェアでNXビットをエミュレートすることはありません。

ノート:

DEP機能は無効化できません。

位置独立実行形式

位置独立実行形式(PIE)機能では、カーネルがテキストを再配置できないように、ランダム・メモリー・アドレスで実行可能バイナリをロードします。位置独立バイナリを生成するには:

  • コンパイル時に、gcc-fpieオプションを設定します。

  • リンク時にld-pieオプションを設定します。

バイナリまたはライブラリを再配置できるかどうかをテストするには、次のコマンドを使用します。

sudo readelf -d elfname | grep TEXTREL