第4章 Linuxのセキュリティ

目次

4.1. マスカレードとファイアウォール
4.2. SSH:安全なネットワーク操作
4.3. パーティションとファイルの暗号化
4.4. AppArmorによる権限の制限
4.5. セキュリティと機密性

概要

マスカレードとファイアウォールを使用すると、データフローとデータの送受信を確実に管理できるようになります。SSH (Secure Shell) を使用すると、暗号化された接続を介してリモートホストにログインできます。ファイルまたはパーティション全体を暗号化すれば、第三者によってシステムに侵入された場合でも、データを保護できます。Linuxネットワークでのセキュリティと、関連する技術的な事柄について学んでください。


4.1 マスカレードとファイアウォール

ネットワーク環境でLinuxを使用する場合は常に、ネットワークパケットを操作するカーネル機能を使用して内部ネットワークと外部ネットワークを隔離できます。Linuxのnetfilterフレームワークは、複数のネットワークを隔離する効果的なファイアウォールを構築する手段を提供します。ルールセットを定義する汎用的なテーブル構造体であるiptablesを使用すれば、ネットワークインタフェースを通すパケットを詳細に制御することが可能です。このようなパケットフィルタは、SuSEfirewall2および対応するモジュールを使用して簡単にセットアップできます。

4.1.1 iptablesによるパケットフィルタリング

netfilterコンポーネントおよびiptablesコンポーネントは、ネットワークアドレス変換(NAT)に加え、ネットワークパケットのフィルタリングと操作の機能を備えています。フィルタ条件およびそれに関連付けられたアクションはルールセットとして格納され、受信したネットワークパケットに対して1つずつ個別に照合されます。使用されるフィルタ条件とアクションのセットはテーブルに格納されます。これらのテーブルおよびルールセットに変更を加えるには、iptablesコマンドを使用します。

Linuxカーネルは、以下の3つのテーブルを管理します。各テーブルは、パケットフィルタの特定の機能カテゴリに対応しています。

filter

このテーブルは、狭い意味での「パケットフィルタリング」メカニズムを実装するもので、フィルタルールの大半を含んでいます。たとえば、パケットを通すか(ACCEPT)破棄するか(DROP)を判定します。

nat

このテーブルは、パケットの送信元アドレスと宛先アドレスに対する変更内容を定義します。これらの機能を使用して、「マスカレード」を実装できます。マスカレードは、プライベートネットワークとインターネットをリンクするNATの一種です。

mangle

このテーブルのルールを使用して、IPヘッダ内の値(サービスタイプなど)を操作できます。

図 4.1 iptables:パケットの可能な経路

iptables:パケットの可能な経路

これらのテーブルには、パケットと照合される次のような複数の事前定義ルールセットが含まれています。

PREROUTING

このルールセットは、着信パケットに適用されます。

INPUT

このルールセットは、システムの内部プロセス宛てのパケットに適用されます。

FORWARD

このルールセットは、システムを通過するだけのパケットに適用されます。

OUTPUT

このルールセットは、このシステム自身が送信元であるパケットに適用されます。

POSTROUTING

このルールセットは、すべての発信パケットに適用されます。

あるシステムにおけるネットワークパケットの伝送経路を図 4.1. 「iptables:パケットの可能な経路」に示します。簡略化するために、この図ではテーブルをルールセットの一部として示してありますが、実際にはこれらのルールセットはテーブル自体に格納されています。

最も単純なケースとして、システム宛の着信パケットがeth0インタフェースに届いた場合を考えてみます。このパケットはまずmangleテーブルのPREROUTINGルールセットと照合され、次にnatテーブルのPREROUTINGルールセットと照合されます。パケットのルーティングに関する次のステップでは、パケットの実際の宛先がシステム自身のプロセスであることが確認されます。mangleテーブルおよびfilterテーブルのINPUTルールセットを経た後、このパケットは、filterテーブルのルールに実際に適合していれば、最終的に宛先に届きます。

4.1.2 マスカレードの基礎知識

マスカレードは、Linux固有のNAT (ネットワークアドレス変換)です。マスカレードを使用すると、小規模LAN (ホストがプライベート範囲のIPアドレスを使用するネットワーク―18.1.2項 「ネットマスクとルーティング」を参照)をインターネット(パブリックIPアドレスを使用するネットワーク)に接続することができます。このLANのホストをインターネットに接続するためには、プライベートアドレスをパブリックアドレスに変換する必要があります。この変換処理は、LANとインターネット間のゲートウェイとして動作するルータで行います。ルータの基本原理は単純です。ルータとは、複数のネットワークインタフェース(通常、ネットワークカードおよびそれとは別のインターネット接続用インタフェース)を備えたネットワーク装置です。インターネット接続用インタフェースは外部に接続し、その他のインタフェースはLAN上のホストに接続します。ルータのネットワークカード(eth0など)に接続されているローカルネットワーク内のホストは、ローカルネットワーク以外の宛先を持つすべてのパケットをデフォルトゲートウェイ、つまりルータに送信します。

[Important]正しいネットワークマスクの使用

ネットワークを設定する際は、すべてのローカルホストに同じブロードキャストアドレスとネットマスクを設定する必要があります。そうしないと、パケットが正しく転送されません。

前述のように、LAN上のホストがインターネット上のアドレス宛にパケットを送信すると、そのパケットは常にデフォルトルータに送信されます。しかし、そのためには、これらのパケットを転送できるようにルータを設定しておく必要があります。セキュリティ上の理由から、SUSE Linuxのインストール時のデフォルト設定では、この転送処理が有効になっていません。有効にするには、/etc/sysconfig/sysctlファイルのIP_FORWARD変数をIP_FORWARD=yesに設定します。

宛先ホストからは、ルータは参照できますが、内部ネットワーク内の送信元ホストに関する情報は一切分かりません。この技術がマスカレード(masquerading:「変装」の意)と呼ばれているのは、このためです。アドレス変換が行われているため、あらゆる応答パケットはまずルータに届きます。ルータはこれらの着信パケットを識別し、宛先アドレスを変換して、ローカルネットワーク内の正しいホストにパケットを転送します。

着信トラフィックのルーティングはマスカレードテーブルによって決まるため、外部から内部ホストへの接続を開く方法はありません。テーブルには、そのような接続に関するエントリがありません。また、確立済みの接続に対してはテーブルでステータスエントリが割り当てられるため、そのエントリは他の接続では使用されません。

このため、マスカレードを使用すると、ICQ、cucme、IRC (DCC、CTCP)、FTP (PORTモード)などいくつかのアプリケーションプロトコルで問題が発生する可能性があります。標準的なFTPプログラムであるNetscapeは、PASVモードを使用しています。PASVモードを使用すれば、パケットフィルタとマスカレードに関する問題が発生する可能性はかなり低くなります。

4.1.3 ファイアウォールの基礎知識

ファイアウォール」は、ネットワーク間のリンクを提供、管理し、ネットワーク間のデータフローを制御するメカニズムを表す用語として、おそらくもっとも広く知られています。ただし、厳密にいうと、このセクションで説明するメカニズムは「パケットフィルタ」と呼ばれるものです。パケットフィルタは、プロトコル、ポート、IPアドレスなどに関する一定の条件に従ってデータフローを規制します。これにより、アドレスに応じて内部ネットワークに到達しないように定められているパケットが、ブロックされます。たとえば、社内のWebサーバを外部に公開するには、対応するポートを明示的に開きます。ただし、パケットフィルタは、社内のWebサーバ宛てのパケットなど、正当なアドレスを持つパケットの内容はスキャンしません。たとえば、着信パケットがWebサーバ上のCGIプログラムの破壊を目的としたものである場合でも、パケットフィルタはそれをそのまま通してしまいます。

より効果的な、しかしより複雑なメカニズムとして、いくつかのタイプのシステムを組み合わせる方法があります。たとえば、パケットフィルタと、プロキシと呼ばれるアプリケーションゲートウェイを連携動作させます。この場合、パケットフィルタは、無効なポートへのパケットをすべて拒否し、アプリケーションゲートウェイ宛てのパケットのみを受け入れます。このゲートウェイ、つまりプロキシは、サーバの実際のクライアントであるかのように振る舞います。ある意味で、このようなプロキシは、アプリケーションによって使用されるプロトコルレベルのマスカレードホストと見なすことができます。プロキシの例としては、HTTPプロキシサーバのSquidがあります。Squidを使用するには、プロキシ経由で通信するようにブラウザを設定する必要があります。要求したHTTPページはまずプロキシのキャッシュ内で検索され、キャッシュに見つからなかったページのみがプロキシによってインターネットから取得されます。別の例としては、FTPプロトコルのプロキシサーバであるSUSE proxy-suite (proxy-suite)があります。

次のセクションでは、SUSE Linuxに付属するパケットフィルタについて説明します。パケットフィルタとファイアウォールに関するより詳細な説明については、howtoパッケージに含まれている『Firewall HOWTO』を参照してください。このパッケージがインストールされていれば、less/usr/share/doc/howto/en/Firewall-HOWTO.gzで『Firewall HOWTO』を参照できます。

4.1.4 SuSEfirewall2

SuSEfirewall2は、/etc/sysconfig/SuSEfirewall2から変数を読み取って一連のiptablesルールを生成するスクリプトです。このスクリプトは、次に示す3つのセキュリティゾーンを定義します(ただし、以降のサンプル設定では1番目と2番目のセキュリティゾーンについてのみ考察します)。

外部ゾーン

外部ネットワークで何が発生しているかを制御できないことを考えれば、ホストを外部ネットワークから保護する必要があることがわかります。外部ネットワークはほとんどの場合インターネットですが、WLANなどそれ以外の安全でないネットワークであることもあります。

内部ゾーン

これはプライベートネットワークを表します。ほとんどの場合はLANになります。内部ネットワーク内のホストがプライベート範囲のIPアドレス(18.1.2項 「ネットマスクとルーティング」を参照)を使用している場合、ネットワークアドレス変換(NAT)を有効にして内部ネットワークのホストが外部ネットワークにアクセスできるようにします。

非武装地帯(DMZ)

このゾーンのホストには外部ネットワークと内部ネットワークの両方からアクセスできますが、このゾーンのホストは自身では内部ネットワークにアクセスできません。DMZ内のシステムは内部ネットワークから隔離されるため、内部ネットワークの周りに追加の防衛線を設けたい場合にこのゾーンを設定します。

フィルタリングルールセットで明示的に許可されていないあらゆる種類のネットワークトラフィックは、iptablesによって抑止されます。したがって、着信トラフィックを持つそれぞれのインタフェースは、3つのゾーンのいずれかに配置する必要があります。各ゾーンに対して、許可するサービスやプロトコルを定義します。ルールセットは、外部ホストから送信されたパケットにのみ適用されます。ローカルに生成されたパケットは、ファイアウォールによって捕捉されません。

設定はYaSTで行うことができます(4.1.4.1項 「YaSTによる設定」を参照)。または、ファイル/etc/sysconfig/SuSEfirewall2に手動で設定することもできます。このファイルには、詳しい注釈が付けられています。また、さまざまな設定例が/usr/share/doc/SuSEfirewall2/EXAMPLESに格納されています。

4.1.4.1 YaSTによる設定

[Important]自動ファイアウォール設定

インストール後に、YaSTは、すべての設定済みインタフェース上で自動的にファイアウォールを起動します。システム上でサーバが設定されており有効になっていれば、は、サーバ設定モジュールの[ファイアウォールで開いているポート]オプションまたは[Open Ports on Selected Interface in Firewall(選択したインタフェースでファイアウォールを開く)]オプションを使用して、生成されたファイアウォール設定に自動的に変更を加えます。サーバモジュールの一部のダイアログでは、[ファイアウォールの詳細]ボタンをクリックすると、追加のサービスとポートを有効にできます。YaSTのファイアウォール設定モジュールは、ファイアウォールを有効または無効にする作業、あるいは再設定する作業に使用できます。

グラフィカル設定用のYaSTダイアログには、YaSTコントロールセンターからアクセスできます。セキュリティとユーザ]+[ファイアウォール]を選択してください。設定は7つのセクションに分かれており、画面左側のツリー構造で各セクションに直接ジャンプすることができます。

起動

このダイアログでは起動動作を設定します。デフォルトのインストールでは、SuSEfirewall2は自動的に起動します。このダイアログで、ファイアウォールを起動または停止することもできます。動作中のファイアウォールに新しい設定を適用するには、[Save Settings and Restart Firewall Now]をクリックします。

図 4.2 YaSTでのファイアウォールの設定

YaSTでのファイアウォールの設定
[インタフェース]

ここには、認識されているすべてのネットワークインタフェースがリストされます。ゾーンからインタフェースを削除するには、削除するインタフェースを選択して、[Change]をクリックし、[No Zone Assigned]を選択します。ゾーンにインタフェースを追加するには、追加するインタフェースを選択して、[変更]をクリックし、使用可能のいずれかのゾーンを選択します。[Custom]を使用して、ユーザ固有の設定で特殊なインタフェースを作成することもできます。

[許可されるサービス]

このオプションは、システムに対するアクセスが禁止されているゾーンに対してシステムサービスを提供するために使用します。デフォルトでは、システムには、外部ゾーンからの保護だけが設定されています。外部のホストで利用可能にするサービスだけを、明示的に許可してください。[Allowed Services for Selected Zone]でゾーンを選択してから、サービスを有効化します。

[マスカレード]

マスカレードは、インターネットのような外部のネットワークから内部のネットワークを隠します。その一方で、内部のネットワークのホストからは外部のネットワークに透過的にアクセスできるようにします。外部ネットワークから内部ネットワークへの要求はブロックされますが、内部ネットワークからの要求は、外部から見ると、マスカレードサーバから発信されたように見えます。内部ホストの特殊なサービスを外部ネットワークから利用可能にする必要がある場合は、そうしたサービス用の特殊なリダイレクトルールを追加します。

[ブロードキャスト]

このダイアログでは、ブロードキャストが可能なUDPポートを設定します。各ゾーンで必要なポート番号またはサービス名を、スペースで区切って指定してください。l/etc/servicesも参照してください。

ここでは、受け付けられなかったブロードキャストについてのログを有効にすることもできます。ただし、Windowsホストは、互いを認識するためにブロードキャストを使用するため、大量のパケットが禁止されることになります。このため、ログを有効にすると大量のパケットがすべてログに記録されてしまいます。

[IPsecサポート]

このダイアログでは、外部ネットワークに対するIPsecサービスを利用できるようにするかどうかを設定します。どのパケットを信頼するかは、[Details]で設定します。

[ログレベル]

ログには、受け付けられたパケットと受け付けられなかったパケットについての、2つのルールがあります。受け付けられなかったパケットは、捨てられるか拒否されます。その両方について、[Log All (すべてログに記録する)][Log Critical(重要なパケットを記録する)][Do Not Log Any (ログに何も記録しない)]のいずれかを選択します。

機能設定が終わったら、[次へ]をクリックしてダイアログを閉じます。ゾーンごとのファイアウォール設定の概要が表示されます。設定がすべて正しいかどうかチェックしてください。このサマリーには、許可されたすべてのサービス、ポート、プロトコルがリストされます。設定を修正するには、[Back]をクリックします。設定内容を保存するには、[Accept]をクリックします。

4.1.4.2 手動による設定

以降では、適切に設定するための手順を順を追って説明します。各設定項目には、ファイアウォールとマスカレードのどちらに関連するかを示してあります。設定ファイルで述べられているDMZ (非武装地帯)関連の設定については、ここでは取り上げません。DMZは、大規模な組織に見られる複雑なネットワークインフラストラクチャ(企業ネットワークなど)でのみ使用されるものであり、広範な設定とこの分野に関する深い知識を必要とします。

まず、YaSTのシステムサービスモジュール(ランレベル)を使用して、使用中のランレベル(通常3または5)でSuSEfirewall2を有効にします。これにより、/etc/init.d/rc?.d/ディレクトリ内のSuSEfirewall2_*スクリプトへのシンボリックリンクが設定されます。

FW_DEV_EXT (ファイアウォール、マスカレード)

インターネットへの接続デバイス。モデム接続の場合は、ppp0を指定します。IDSNリンクの場合は、ippp0を指定します。DSL接続には、dsl0を指定します。デフォルトルートに対応するインタフェースを使用する場合は、autoを指定します。

FW_DEV_INT (ファイアウォール、マスカレード)

内部プライベートネットワークへの接続デバイス(eth0など)。内部ネットワークがなく、ファイアウォールが動作するホストのみを保護する場合は、空にします。

FW_ROUTE (ファイアウォール、マスカレード)

マスカレード機能が必要な場合は、yesに設定します。内部ホストのネットワークアドレス(例: 192.168.x.x)がインターネットルータで無視されるようになるため、内部ホストは外部から見えなくなります。

マスカレード機能なしのファイアウォールで、内部ネットワークへのアクセスを許可する場合は、これをyesに設定します。この場合、内部ホストでは公式のIPアドレスを使用する必要があります。ただし、外部ネットワークから内部ネットワークへのアクセスは許可しないのが普通です。

FW_MASQUERADE (マスカレード)

マスカレード機能が必要な場合は、yesに設定します。これにより、内部ホストからインターネットへの仮想的な直接接続が実現されます。内部ネットワークのホストとインターネット間にプロキシを設定すると、セキュリティが強化されます。プロキシサーバが提供するサービスにはマスカレードは必要ありません。

FW_MASQ_NETS (マスカレード)

マスカレードを行うホストやネットワークを指定します。各エントリはスペースで区切ります。次に例を示します。

FW_MASQ_NETS="192.168.0.0/24 192.168.10.1"
FW_PROTECT_FROM_INT (ファイアウォール)

内部ネットワークからの攻撃に対してファイアウォールホストを保護するには、yesに設定します。サービスは、明示的に有効にした場合にのみ、内部ネットワークに対して提供されます。FW_SERVICES_INT_TCPおよびFW_SERVICES_INT_UDPも参照してください。

FW_SERVICES_EXT_TCP (ファイアウォール)

使用可能にするTCPポートを指定します。一般的な自宅用のワークステーションでは、通常サービスは提供していないため、空にします。

FW_SERVICES_EXT_UDP (ファイアウォール)

UDPサービスを実行しており、それを外部から使用できるようにする場合を除き、空にします。UDPを使用したサービスとしては、DNSサーバ、IPSec、TFTP、DHCPなどがあります。これらのサービスを使用可能にする場合は、使用するUDPポートを指定します。

FW_SERVICES_INT_TCP (ファイアウォール)

この変数には、内部ネットワークに対して使用可能にするサービスを指定します。記述形式はFW_SERVICES_EXT_TCPと同じですが、この設定は内部ネットワークに適用されます。この変数は、FW_PROTECT_FROM_INTyesに設定した場合のみ設定します。

FW_SERVICES_INT_UDP (ファイアウォール)

FW_SERVICES_INT_TCPの項を参照してください。

ファイアウォールの設定が完了したら、設定をテストします。ファイアウォールのルールセットは、root権限でSuSEfirewall2 startを実行すると作成されます。次に、telnetを使用して、たとえば外部ホストから接続が実際に拒否されるかどうかを確認します。その後、/var/log/messagesを参照します。次のようなログが記録されているはずです。


Mar 15 13:21:38 linux kernel: SFW2-INext-DROP-DEFLT IN=eth0 
OUT= MAC=00:80:c8:94:c3:e7:00:a0:c9:4d:27:56:08:00 SRC=192.168.10.0 
DST=192.168.10.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=15330 DF PROTO=TCP 
SPT=48091 DPT=23 WINDOW=5840 RES=0x00 SYN URGP=0 
OPT (020405B40402080A061AFEBC0000000001030300)

他にも、nmapやnessusといったパッケージを使用して、ファイアウォールの設定をテストできます。パッケージをインストールすると、nmapのドキュメントは/usr/share/doc/packages/nmapに、nessusのドキュメントは/usr/share/doc/packages/nessus-coreに置かれます。

4.1.5 関連情報

SuSEfirewall2の最新情報およびその他のドキュメントは、/usr/share/doc/packages/SuSEfirewall2で参照できます。また、netfilter/iptablesプロジェクトのホームページhttp://www.netfilter.orgでは、さまざまな文書を多くの言語で参照できます。