セキュリティと機密性

目次

49.1. ローカルセキュリティとネットワークセキュリティ
49.2. セキュリティ全般のヒントとテクニック
49.3. Central Security Reporting Addressの使用

LinuxまたはUNIXシステムの主な特性は、同時に複数のユーザを処理できること(マルチユーザ)と、これらのユーザが同じコンピュータ上で同時に複数のタスクを実行できること(マルチタスキング)です。さらに、オペレーティングシステムはネットワークを意識させません。通常、ユーザは自分が使用しているデータやアプリケーションが各自のマシンからローカルに提供されているのか、ネットワークを介して使用可能になっているかを意識することはありません。

マルチユーザ機能を使用する場合、様々なユーザのデータを別々に格納する必要があります。また、セキュリティとプライバシーを保証する必要があります。データのセキュリティは、コンピュータをネットワーク経由でリンクできるようになる以前から、すでに重要な問題になっていました。現在と同様に、最重要課題は、データメディア(ほとんどの場合はハードディスク)が消失したり他の方法で破損した場合にも、データを使用可能な状態で維持する機能でした。

この章では、主として機密性の問題とユーザのプライバシーを保護する手段について重点的に説明します。ただし、定期的に更新されて作業可能なテスト済みバックアップを常に備えておくための手順を確立することが包括的なセキュリティの概念には不可欠であるという点については、詳しく説明しません。この手順がなければ、何らかのハードウェア障害が発生した場合のみでなく、誰かが不正にアクセスしてファイルを改ざんしたという疑いが生じた場合にも、データの復旧作業に手間と時間がかかることになります。

ローカルセキュリティとネットワークセキュリティ

データにアクセスするには、次のような複数の方法があります。

  • 必要な情報を持っているユーザとの個人的な通信、またはコンピュータ上のデータへのアクセス

  • コンピュータのコンソールからの直接アクセス(物理アクセス)

  • シリアル回線を介したアクセス

  • ネットワークリンクを使用したアクセス

いずれの場合も、ユーザが問題のリソースやデータにアクセスするには、認証を受ける必要があります。この点ではWebサーバはあまり限定的ではありませんが、すべての個人データを第三者に公開しないようにする必要はあります。

上記のリストのうち、最初の項目では、銀行の担当者に連絡したときに自分が口座名義人であるという証明を要求される場合のように、多くの対話を必要とします。この場合は、署名、PINまたはパスワードなど、自分の身元を証明する情報を提供するように要求されます。場合によっては、単に知っている情報を断片的に述べ、言葉巧みに信頼させて相手から情報を引き出す可能性もあります。その結果、情報が少しずつ明らかになり、そのことに気づかないことさえあります。ハッカーの間では、この行為を「ソーシャルエンジニアリング」と呼んでいます。この行為を防止するには、人々を教育し、言語や情報を自覚して取り扱うしかありません。通常、攻撃者はコンピュータシステムに侵入する前に、受付係、会社のサービススタッフ、家族などをターゲットにしようとします。多くの場合、このようなソーシャルエンジニアリングに基づく攻撃は、はるか後になるまで発見されません。

他人のデータに不正にアクセスしようとする第三者は、従来の方法を使用して他人のハードウェアに直接接続を試みることもあります。そのため、マシンは他人にコンポーネントを削除、交換または無効化されないように、あらゆる改ざんから保護する必要があります。これは、バックアップ、ネットワークケーブル、電源コードにも当てはまります。また、一部のキーの組合せは異常動作を引き起こす場合があるため、ブート手順も保護してください。自己防衛のためには、BIOSとブートローダーのパスワードを設定する必要があります。

シリアルポートに接続されたシリアル端末は、従来から多くの場所で使用されています。ネットワークインタフェースとは異なり、ホストとの通信をネットワークプロトコルに依存しません。デバイス間での単なる文字のやりとりには、単純なケーブルまたは赤外線ポートが使用されます。このようなシステムでは、ケーブル自体が一番の弱点になります。古いプリンタを接続すれば、ケーブルを通じて伝送されるすべてのデータを記録できてしまいます。攻撃対象によっては、プリンタで実行できることであれば他の方法でも実行できます。

ホスト上でファイルをローカルに読み込むには、他のホスト上でサーバとのネットワーク接続をオープンする以外のアクセスルールが必要です。ローカルセキュリティとネットワークセキュリティには、違いがあります。つまり、データをどこかにパケット単位で送信する必要がある場合には、回線が使用されます。

ローカルセキュリティ

ローカルセキュリティは、コンピュータが稼働している場所の物理環境から始まります。マシンは、セキュリティ上の要件やニーズに沿った場所に設置してください。ローカルセキュリティの主な目標は、誰も他人の権限や識別情報を偽れないように、常にユーザを相互に分離しておくことです。これは遵守すべき原則ですが、ユーザrootの場合はシステム上で最高の権限を持つため、このことが特に重要になります。rootユーザは、パスワードを求めるプロンプトなしで、他のすべてのローカルユーザの識別情報を使用して、ローカルに格納されているファイルをすべて読み込むことができます。

パスワード

Linuxシステムでは、パスワードが平文として格納されることはなく、入力されたテキスト文字列が保存されているパターンと単に照合されるのでもありません。平文として格納され、保存されているパターンと照合されるのみであれば、対応するファイルに誰かがアクセスした直繧ノ、システム上のすべてのアカウントが危険にさらされることになります。代わりに、格納されているパスワードは暗号化されており、入力されるパスワードもそのたびに再び暗号化され、暗号化された2つの文字列が比較されます。この方法でセキュリティレベルが向上するのは、暗号化されたパスワードを逆算して元のテキスト文字列に戻せない場合のみです。

実際には、この処理は特殊なアルゴリズムによって達成されます。このアルゴリズムは、一方向にしか機能しないため、「トラップドアアルゴリズム」とも呼ばれます。暗号化された文字列を攻撃者が入手しても、単に同じアルゴリズムを再適用するだけでは他人のパスワードを取得できません。代わりに、暗号化すると他人のパスワードになる組合せが見つかるまで、考えられる文字の組合せをすべてテストする必要があります。パスワードが長さ8文字であれば、計算が必要な組合せの候補は膨大な数になります。

1970年代には、使用されていたアルゴリズムが比較的低速で、1つのパスワードを暗号化するだけで数秒かかっていたため、この方法が他の方法よりも安全であると言われていました。ただし、その後はPCのパフォーマンスが向上し、毎秒数10万~数100万回の暗号化を実行できるようになっています。このため、暗号化されたパスワードは通常のユーザが参照できないようにする必要があります(通常のユーザは/etc/shadowファイルを読み込めません)。さらに重要なのは、何らかのエラーが原因でパスワードファイルが参照可能になった場合に備えて、簡単に推測できないパスワードを使用することです。したがって、「tantalise」のようなパスワードを「t@nt@1ls3」に「変換」したとしても、実際には役に立ちません。

語句の一部の文字を数字に同じパターンで置き換えただけでは、安全とは言えません。辞書を使用して語句を推測するパスワードクラックプログラムも、これと同様の置換を行います。そこで、「The Name of the Rose」 by Umbert Eco (ウンベルトエーコ著『薔薇の名前』)のように、文や書名に含まれる語句の頭文字など、一般的な意味はなく、自分にしか意味のない語句を作成するのが適切な方法です。こうして作成される「TNotRbUE9」のようなパスワードは安全と言えます。これに対して、「beerbuddy」や「jasmine76」のようなパスワードは、ユーザに関してわずかしか知識のない他人でさえ簡単に推測できます。

ブート手順

システムは、ドライブ全体を取り外すか、BIOSパスワードを設定してハードディスクからでなければブートできないようにBIOSを設定し、フロッピーやCDからはブートできないように設定してください。通常、Linuxシステムはブートローダーから起動するため、ブートしたカーネルに追加のオプションを渡すことができます。/boot/grub/menu.lst内でパスワードを追加設定し、他のユーザがこの種のパラメータをブート時に使用できないようにしてください(を参照)。第21章 ブートローダこれはシステムのセキュリティに不可欠です。カーネル自体がroot権限で実行されるのみでなく、システム起動時にroot権限を付与する最初の認可でもあります。

ファイルのパーミッション

通常は、特定のタスクに可能な最も限定的な権限で作業します。たとえば、電子メールを読み書きするには、rootユーザである必要はありません。メールプログラムにバグがあると、このバグが攻撃にさらされ、起動時にプログラムのパーミッションが正確に処理されてしまう可能性があります。限定的な権限のルールに従って、考えられる損害を最小限に抑えてください。

SUSE Linux Enterpriseのディストリビューションパッケージに付属するすべてのファイルについては、パーミッションが慎重に選択されています。ソフトウェアや他のファイルを追加インストールするシステム管理者は、特にパーミッションビットの設定時には細心の注意を払う必要があります。経験豊富でセキュリティ意識の高いシステム管理者は、常にコマンドls-lオプションを使用して広範なファイルリストを取得します。これにより、不正なファイルパーミッションを即時に検出できます。不正なファイル属性は、そのファイルが変更または削除された可能性を意味するだけではありません。このように変更されたファイルがrootユーザにより実行される可能性や、設定ファイルの場合はこの種のファイルがプログラムでrootユーザの権限で使用される可能性があります。このため、攻撃者が侵入する可能性が大幅に増大します。このような攻撃は、カッコウが他の鳥をだまして自分の卵を孵化させるのと同様に、プログラム(卵)が他のユーザ(鳥)によって実行(孵化)されるため、カッコウの卵と呼ばれます。

SUSE Linux Enterpriseシステムでは、ファイルpermissionspermissions.easypermissions.secure、およびpermissions.paranoidがすべてディレクトリ/etcにあります。これらのファイルの目的は、world-writableなディレクトリなどの特殊な権限や、ファイルに対するsetuser IDビットを定義することです(setuser IDビットが設定されているプログラムは、それを起動したユーザの権限ではなく、ファイル所有者、ほとんどの場合はrootユーザの権限で実行されます)。管理者は、ファイル/etc/permissions.localを使用して自分専用の設定を追加できます。

SUSE Linux Enterpriseの環境設定プログラムが上記のどのファイルを使ってパーミッションを設定するかを定義するには、YaSTの[ローカルセキュリティ]セクションで、[Security and Users]を選択します。このトピックの詳細は、/etc/permissions内のコメントまたはchmodのマニュアルページを(man chmodコマンドを実行して)参照してください。

バッファオーバーフローと書式文字列のバグ

プログラムがユーザによる変更が可能なデータを処理すると思われる場合は、特に注意する必要がありますが、これは通常のユーザよりもアプリケーションプログラマにとって問題です。プログラマは、小さすぎてデータを保持できないメモリ領域に書き込むことなく、自分のアプリケーションでデータが適切に解析されることを確認する必要があります。また、プログラムでは、専用に定義されたインタフェースを使用して、データを一貫した方法で受け渡す必要があります。

実際のメモリバッファのサイズを考慮しないと、そのバッファの書き込み時に「バッファオーバーフロー」が発生する可能性があります。また、このデータ(ユーザが生成)に使用される領域が、バッファ内で使用可能な領域を超える場合があります。その結果、データはそのバッファ領域の終わりを超えて書き込まれ、状況によってはプログラムで単にユーザデータが処理されるのではなく、ユーザ(プログラマではなく)が変更したプログラムシーケンスが実行される可能性があります。この種のバグは、特にプログラムが特殊な権限で実行されている場合には、重大な結果を招きます(49.1.4項 「ファイルのパーミッション」を参照)。

書式文字列のバグの場合、動作は少し異なりますが、プログラムの異常動作を引き起こす可能性のあるユーザ入力です。ほとんどの場合、この種のプログラミングエラーは、setuidプログラムやsetgidプログラムなど、特殊な権限で実行されるプログラムに見られます。これも、対応する実行権限をプログラムから削除することで、データとシステムをこの種のバグから保護できることを意味します。また、最善の方法は、考えられる最小権限を使用するというポリシーを適用することです(49.1.4項 「ファイルのパーミッション」を参照)。

バッファオーバーフローと書式文字列のバグがユーザデータの処理に関連するバグであるとすれば、アクセス権がローカルアカウントに付与されている場合にのみ発生するわけではありません。レポートされているバグの多くは、ネットワークリンク上でも利用される可能性があります。したがって、バッファオーバーフローと書式文字列のバグは、ローカルセキュリティとネットワークセキュリティの両方に関連する問題として分類する必要があります。

ウィルス

通説とは異なり、Linux上で動作するウィルスは存在します。ただし、判明しているウィルスは、テクニックが意図したとおりに動作することを証明するために、作成者が自分のアイデアの証明としてリリースしたものです。この種のウィルスは、これまでのところいずれも一般には検出されていません。

ウィルスは、活動するホストがなければ存続も拡散もできません。たとえば、ホストがプログラムやシステムの重要な記憶領域(マスターブートレコードなど)であり、そこにウィルスのプログラムコードを書き込む必要があるとします。Linuxにはマルチユーザ機能があるため、特定のファイルへの書き込みアクセスを制限でき、これは特にシステムファイルの場合に重要です。したがって、root権限で通常の作業を実行すると、システムがウィルスに感染する可能性が増大します。これに対して、考えられる最小権限を使用するという原則に従えば、ウィルスに感染する可能性は低下します。

それとは別に、実際には知らないインターネットサイトからはプログラムを実行しないようにする必要があります。SUSE Linux EnterpriseのRPMパッケージは、その作成に必要な措置が講じられたデジタルラベルとして暗号署名を使用します。ウィルスは、管理者やユーザにセキュリティに関して必要な自覚が欠けており、設計によって高度に保護されているシステムであっても危険にさらす可能性があることを示す典型的な兆候です。

ウィルスをワームと混同しないようにする必要があります。ワームの対象はネットワーク全体です。ワームの拡散にはホストを必要としません。

ネットワークセキュリティ

ネットワークセキュリティは、外部で開始される攻撃から保護する場合に重要です。ユーザ認証にユーザ名とパスワードを必要とする典型的なログイン手順は、ローカルセキュリティの課題です。ネットワーク経由の特殊なログインの場合は、2つのセキュリティの課題を区別してください。実際の認証までに発生する処理はネットワークセキュリティに関連し、その後に発生する処理はローカルセキュリティに関連します。

X Window SystemとX認証

冒頭に述べたように、ネットワーク透過性は、UNIXシステムの中核的な特性の1つです。UNIXオペレーティングシステムのウィンドウシステムであるXは、この機能を優れた方法で実現します。Xを使用すると、リモートホストでログインしてグラフィカルプログラムを起動しても基本的には問題はなく、グラフィカルプログラムはネットワーク経由で送信されてコンピュータに表示されます。

Xサーバを使用してXクライアントをリモートで表示する必要がある場合、Xサーバは管理対象のリソース(ディスプレイ)を不正アクセスから保護する必要があります。より厳密には、クライアントプログラムに特定の権限を付与する必要があります。X Window Systemでは、この権限付与を ホストベースのアクセスコントロールおよびCookieベースのアクセスコントロールと呼ばれる2通りの方法で実行できます。前者は、クライアントが実行されるホストのIPアドレスに依存します。これを制御するプログラムがxhostです。xhostは正当なクライアントのIPアドレスをXサーバに属する小型データベースに入力します。ただし、認証はIPアドレスに依存するため、安全度は高くありません。たとえば、クライアントプログラムを送信中のホストで第2のユーザが作業している場合、そのユーザはXサーバにもアクセスできます。IPアドレスを盗む第三者はこれと同じことをしているに過ぎません。このような欠点があるため、ここではこの認証方式について詳述しません。詳細は、manxhostを参照してください。

Cookieベースのアクセスコントロールの場合は、ある種のIDカードと同様に、Xサーバと正当なユーザにのみ認識される文字列が生成されます。このCookie(通常のクッキーを意味するのではなく、エピグラムが入っている中国のフォーチュンクッキー)は、ログイン時にユーザのホームディレクトリのファイル.Xauthorityに格納され、Xサーバを使用してウィンドウを表示しようとするすべてのXクライアントで使用できます。ファイル.Xauthorityは、ツールxauthを使用して検査できます。.Xauthorityの名前を変更したり、意図せずにホームディレクトリから削除すると、新規のウィンドウやXクライアントをオープンできなくなります。X Window Systemのセキュリティメカニズムの詳細は、Xsecurityのmanページを参照してください(manXsecurity)。

SSH(セキュアシェル)を使用すると、ユーザには暗号化メカニズムを意識させることなく、ネットワーク接続を完全に暗号化してXサーバに透過的に転送(フォーワード)することができます。この処理は「X転送」とも呼ばれます。X転送は、サーバ側でXサーバをシミュレートし、リモートホスト上でシェルのDISPLAY変数を設定することで行われます。SSHについての詳細な情報は第44章 SSH:セキュアネットワークオプションを参照してください。

[Warning]

ログイン先のホストに対して、ホストの保護を考慮していない場合は、X転送を使用しないでください。X転送を有効にすると、攻撃者がユーザのSSH接続を介して認証し、Xサーバに侵入し、ユーザになりすましてキーボード入力などを行う可能性があります。

バッファオーバーフローと書式文字列のバグ

49.1.5項 「バッファオーバーフローと書式文字列のバグ」で説明したように、バッファオーバーフローと書式文字列のバグは、ローカルセキュリティとネットワークセキュリティの両方に関係する課題として分類する必要があります。この種のバグのローカルバリエーションと同様に、ネットワークプログラムでのバッファオーバーフローは、首尾よく利用されてしまうと、ほとんどの場合はroot権限の取得に使用されます。それ以外の場合にも、攻撃者がバグを利用して権限のないローカルアカウントにアクセスし、システムに存在する他の脆弱部分を利用する可能性があります。

ネットワークリンク経由で利用される恐れのあるバッファオーバーフローと書式文字列のバグは、リモート攻撃全体で最も頻度の高い形式であることは確実です。このような、新しく見つかったセキュリティホールを悪用するプログラムは、しばしばセキュリティメーリングリストに投稿されます。この情報を使用すると、コードの詳細を知らなくても脆弱部分を絞り込むことができます。多年の経験では、オペレーティングシステムメーカーは自社ソフトウェアの問題を修正せざるを得ないため、悪用可能なコードを知ることがオペレーティングシステムのセキュリティレベル向上に役立つことが判明しています。フリーソフトウェアを使用すれば、誰でもソースコードにアクセスでき(SUSE Linux Enterpriseの場合は、ソースコードがすべて使用可能です)、脆弱部分とその悪用可能なコードを見つけたユーザは誰でも、対応するバグ修正のためのパッチを発行できます。

サービス拒否

DoS攻撃は、サーバプログラムまたはシステム全体をブロックすることを目的にしています。そのために、サーバを過負荷状態にして、常時無駄なパケットを送信してビジー状態にしたり、リモートバッファオーバフローを引き起こすなど、さまざまな手段が用いられます。通常、DoS攻撃はサービスの消失のみを目的として実行されます。ただし、特定のサービスが使用不能になると、man-in-the-middle攻撃(パケット盗聴、TCP接続のハイジャック、偽装攻撃)やDNSポイゾニングなどに対して脆弱になる可能性があります。

中間者攻撃:盗聴、ハイジャック、なりすまし

一般に、通信中のホスト間に割り込む攻撃者が実行するリモート攻撃は、「man-in-the-middle攻撃」と呼ばれます。ほぼすべてのタイプのman-in-the-middle攻撃に共通するのは、通常、ユーザは何が起きているのかに気づかないことです。攻撃者が接続要求をターゲットマシン宛てに転送するなど、様々なバリエーションが考えられます。その場合、相手のマシンは有効な接続先マシンであるかのように偽装されているので、知らないうちに不正なホストとの接続が確立されることになります。

最も単純なタイプの中間者攻撃は盗聴(傍受)と呼ばれ、攻撃者はネットワークトラフィックを傍受します。より複雑な「man in the middle」攻撃は、すでに確立された接続を乗っ取ろうとします(ハイジャック)。これを実現するため、攻撃者は一定時間だけパケットを分析し、接続に属するTCPシーケンス番号を予測できる必要があります。攻撃者が最終的にターゲットホストのロールを停止すると、エラーのため接続が終了したことを示すエラーメッセージが\'95\'5c示されるため、このことがわかります。暗号化を介してハイジャックから保護されるプロトコルはなく、接続の確立時には単純認証手順しか実行されないことが、攻撃を容易にしています。

偽装攻撃は、パケットが偽のソースデータ(通常はIPアドレス)を含むように変更される攻撃です。攻撃に利用させる手段の多くは偽のパケット(Linuxマシンではスーパーユーザであるrootのみしか実行できないようなパケット)を送りつける方法です。

前述の攻撃の多くは、DoSと組み合わせて実行されます。特定のホストを短時間でも突然停止できることが攻撃者にわかれば、ホストは攻撃で一定時間は干渉できなくなるため、攻撃者は容易にアクティブ攻撃をかけられるようになります。

DNSポイゾニング

DNSポイゾニングとは、攻撃者が偽装したDNSリプライパケットで応答し、サーバの情報を要求しているユーザに対して、そのサーバから特定のデータを送信するよう試みることにより、DNSサーバのキャッシュを破壊す驍アとを意味します。多くのサーバは、IPアドレスまたはホスト名に基づいて他のホストとの信頼関係を維持しています。攻撃者は、ホスト間の信頼関係の実際の構造を詳細に理解した上で、自分を信頼のおけるホストの1つとして偽装する必要があります。通常、攻撃者はサーバから受信した一部のパケットを分析し、必要な情報を取得します。また、しばしば攻撃者はネームサーバも適切なタイミングによるDoS攻撃のターゲットとする必要があります。接続先ホストの識別情報を確認できる、暗号化された接続を使用することで、自分自身を保護してください。

ワーム

ワームはしばしばウィルスと混同されますが、両者には明らかな違いがあります。ウィルスとは異なり、ワームはホストプログラムに感染しなくても活動できます。代わりに、ネットワーク構造上でできるだけ迅速に拡散するように特化されています。Ramen、Lion、Adoreなど、これまでに出現したワームは、bind8やlprNGなどのサーバプログラムの周知のセキュリティホールを使用しています。ワームからの保護は、比較的容易です。代わりに、ネットワーク構造上でできるだけ迅速に拡散するように特化されています。これが役立つのは、管理者が問題のシステムにセキュリティ更新を実際にインストールする場合のみです。