第4章 ツールとサービスを使用したシステム強化

4.1. デスクトップのセキュリティー

Red Hat Enterprise Linux 7 は、不正アクセスの防止や攻撃から守るためのデスクトップ強化に複数の手段を提供しています。本項では、ユーザーパスワード、セッション、アカウントのロック、取り外し可能なメディアの安全な取り扱いについて推奨の方法を紹介します。

4.1.1. パスワードのセキュリティー

パスワードは、Red Hat Enterprise Linux 7 がユーザーの ID を確認する第一の手段です。ユーザーやワークステーション、ネットワークの保護にパスワードのセキュリティーが重要であるのは、このためです。
インストールプログラムではセキュリティー目的で、システムが セキュアハッシュアルゴリズム 512 (SHA512) とシャドウパスワードを使うように設定します。この設定は、変更しないことが強く推奨されます。
インストール中にシャドウパスワードが検出されると、すべてのパスワードは全ユーザーが読み取り可能な /etc/passwd ファイルに一方向のハッシュとして保存されます。この場合、システムはオフラインのパスワードクラッキング攻撃に脆弱なものとなってしまいます。侵入者が通常のユーザーとしてマシンにアクセスすると、/etc/passwd ファイルを侵入者自身のマシンにコピーして、パスワードクラッキングプログラムをいくつでも実行できるようになります。このファイルに安全でないパスワードがあれば、パスワードクラッカーがこれを見つけるのは時間の問題となります。
シャドウパスワードは、パスワードハッシュを /etc/shadow ファイルに保存することで、このタイプの攻撃を排除します。このファイルは、root ユーザーのみが読み取り可能なためです。
この場合、攻撃者は SSH や FTP などのマシン上のネットワークサービスにログインしてリモートからパスワードクラッキングを試みることが強いられます。このようなブルートフォース攻撃は時間がかかり、何百回ものログイン失敗がシステムファイルに書き込まれるので、明らかな痕跡が残ります。もちろん、クラッカーが脆弱なパスワードがあるシステムに真夜中から攻撃を開始した場合、夜明け前にはアクセスに成功し、痕跡を隠すためにログファイルを編集してしまう、という可能性もあります。
フォーマットやストレージに加えて考慮すべき点は、コンテンツの問題です。パスワードクラッキングからアカウントを保護するためにユーザーがなし得る最重要事項は、強固なパスワードを作成することです。

注記

Red Hat は、Red Hat Identity Management (IdM) などの集約型の認証ソリューションの使用を推奨します。ローカルのパスワードよりも集約型のソリューションの使用が推奨されます。詳しい情報は、以下のリンクをご覧ください。

4.1.1.1. 強固なパスワードの作成

安全なパスワードを作成するには、長いパスワードの方が短くかつ複雑なものよりも強固であることをユーザーは認識する必要があります。あるパスワードが数字や特殊文字、大文字のアルファベットを含んでいても、それが 8 文字の長さしかなければ、強固なパスワードとは言えません。「John The Ripper」のようなパスワード解析ツールは、人間が記憶するには困難なパスワードを分解するために最適なものです。
情報の理論上では、エントロピーはランダムな変数に関連付けられる不確実性のレベルで、ビット表示されます。エントロピーの値が高ければ高いほど、パスワードはより安全と言えます。NIST (米標準技術研究所) の SP 800-63-1 文書によると、一般的に選択される 5 万件のパスワードからなる辞書にないパスワードには、少なくとも 10 ビットのエントロピーがあります。このため、ランダムな 4 単語からなるパスワードには、およそ 40 ビットのエントロピーがあることになります。安全性を高めるために複数の単語で構成される長いパスワードは、パスフレーズ とも呼ばれます。例を示します。
randomword1 randomword2 randomword3 randomword4
大文字や数字、特殊文字の使用が強制されるシステムでは、上記の推奨事項に合致するパスフレーズは簡単に修正することができます。たとえば、最初の文字を大文字にして、"1!" を追加します。このような修正は、パスフレーズの安全性を大幅に高めるもの ではない ことに注意してください。
パスワードを自分で作成するもうひとつの方法は、パスワードジェネレーターを使用することです。pwmake は、大文字、小文字、数字、特殊文字の 4 種類の文字からなるランダムなパッケージを生成するコマンドラインツールです。このユーティリティーを使うと、パスワード生成に使用されるエントロピービットの数を指定することができます。エントロピーは、/dev/urandom から引き出されます。指定可能な最小ビット数は 56 で、これはブルートフォース攻撃が滅多に仕掛けられないシステムやサービスのパスワードには十分なものです。攻撃者がパスワードハッシュファイルに直接アクセスできないアプリケーションであれば、64 ビットで十分です。攻撃者がパスワードハッシュへの直接アクセスを取得する可能性がある場合やパスワードが暗号化鍵として使用される場合は、80 ビットや 128 ビットを使うべきです。無効なエントロピービット数を指定すると、pwmake はデフォルトのビット数を使用します。128 ビットのパッケージを作成するには、以下のコマンドを実行します。
pwmake 128
安全なパスワードの作成にはいくつものアプローチがありますが、以下の悪い点は必ず避けてください。
  • 辞書の 1 単語を使用する。外国語の 1 単語を使用する。反転した単語を使用する。数字のみを使用する。
  • パスワードまたはパスフレーズを 10 文字未満にする。
  • キーボードのレイアウトにおけるキーの配列を使用する。
  • パスフレーズを書き留める。
  • 誕生日や記念日、家族の名前、ペットの名前などの個人情報をパスフレーズに使用する。
  • 複数のマシンで同じパスワードまたはパスフレーズを使用する。
セキュアなパスワードの作成は不可欠ですが、パスワードの適切な管理も特に大きな組織のシステム管理者にとっては重要です。次のセクションでは、組織内でのユーザーパスワードの作成および管理で推奨される方法を説明します。

4.1.1.2. 強固なパスワードの強制

組織内に多くのユーザーがいる場合、システム管理者は 2 つの基本的な方法で強固なパスワードの使用を強制できます。つまり、管理者がパスワードを作成してユーザーに渡すか、パスワードに十分な強度があるかを検証しながらユーザー自身がパスワードを作成する方法です。
前者の方法だとパスワードは強固なものになりますが、組織が拡大するにつれてタスクが重荷になります。また、ユーザーが自分のパスワードを書き留め、それをさらしてしまうリスクも高まります。
これらの理由で、多くのシステム管理者は後者を選択しますが、パスワードが強固かどうかを積極的に検証します。場合によっては、管理者はパスワードエージングで定期的にユーザーがパスワードを変更するように強制することもできます。
ユーザーは、パスワードの作成や変更を求められると、passwd コマンドラインユーティリティーを使用することができます。これは PAM (Pluggable Authentication Modules) を認識し、パスワードが短すぎないか、短くない場合は簡単にクラックされないかを確認します。この確認は、pam_pwquality.so PAM モジュールが実行します。

注記

Red Hat Enterprise Linux 7 では、pam_pwquality PAM モジュールが pam_cracklib の代わりとなっています。後者は、Red Hat Enterprise Linux 6 でパスワードの品質確認にデフォルトのモジュールとして使われていました。新たなモジュールは、pam_cracklib と同じバックエンドを使用します。
pam_pwquality モジュールは、ルールセットに対してパスワードの強度を確認するために使用されます。確認の手順は 2 段階になります。まず、該当パスワードが辞書にあるかどうかをチェックします。辞書にない場合は、さらにいくつかのチェックを行います。pam_pwquality/etc/pam.d/passwd ファイルの password コンポーネント内に他の PAM モジュールと並んでいます。ルールのカスタムセットは、/etc/security/pwquality.conf 設定ファイル内で指定されます。これらのチェック項目の完全一覧については、pwquality.conf (8) man ページを参照してください。

例4.1 pwquality.conf 内でのパスワード強度チェックの設定

pam_quality の使用を有効にするには、以下の行を /etc/pam.d/passwd ファイルのpassword スタックに追加します。
password    required    pam_pwquality.so retry=3
チェック項目のオプションは、1 行に 1 つずつ指定します。たとえば、パスワードを 8 文字以上にして、4 種類すべての文字を含めることを要件とするには、以下の行を /etc/security/pwquality.conf ファイルに追加します。
minlen = 8 
minclass = 4
文字シーケンスと連続した同じ文字についてパスワード強度チェックを設定するには、以下の行を /etc/security/pwquality.conf に追加します。
maxsequence = 3
maxrepeat = 3
この例では、入力するパスワードに、abcd などの単純なシーケンスの 3 文字を超える文字と、1111 などの 3 文字を超える同一連続文字を含めることができません。

注記

root ユーザーはパスワード作成ルールを強制している本人なので、警告メッセージが出ても自分または通常ユーザーにどんなパスワードでも設定することができます。

4.1.1.3. パスワードエージングの設定

パスワードエージングは、システム管理者が組織内での脆弱なパスワードに対する防御として用いるもうひとつのテクニックです。パスワードエージングとは、一定期間後 (通常 90 日) にユーザーが新たなパスワードを作成するように求められるシステムのことです。理論上は、ユーザーに定期的なパスワード変更を強制すれば、クラックされたパスワードは侵入者にとって一定期間しか有効でないことになります。しかし、パスワードエージングのマイナス面は、ユーザーがパスワードを書き留める可能性が高くなるという点です。
Red Hat Enterprise Linux 7 でパスワードエージングを指定するには、chage コマンドを使用します。

重要

Red Hat Enterprise Linux 7 では、デフォルトでシャドウパスワードが有効になっています。詳細は、Red Hat Enterprise Linux 7 システム管理者のガイドを参照してください。
chage コマンドの -M オプションでは、パスワードが有効となる最長日数を指定します。例えば、ユーザーのパスワードが 90 日間で期限切れとなるように設定するには、以下のコマンドを実行します。
chage -M 90 username
上記のコマンドでは、username をユーザーの名前に置き換えます。パスワードの有効期限を無効にするには、-M オプションの後に -1 の値を指定します。
chage コマンドで使用可能なオプションの詳細情報については、以下の表を参照してください。

表4.1 chage のコマンドラインオプション

オプション説明
-d days1970 年 1 月 1 日から最後にパスワードを変更した日までの日数を指定します。
-E dateアカウントがロックされる日付を YYYY-MM-DD の形式で指定します。日付の代わりに、 1970 年 1 月 1 日からの日数を指定することも可能です。
-I daysパスワードが失効してからアカウントがロックされるまでのアクティブでない日数を指定します。値を 0 とすると、パスワード失効後にアカウントはロックされません。
-l現在のアカウントエージングの設定を一覧表示します。
-m daysパスワード変更が必要となる間隔の最短日数を指定します。値を 0 とすると、パスワードは失効しません。
-M daysパスワードの有効最長日数を指定します。このオプションで指定した日数と -d オプションで指定した日数の合計が、1970 年 1 月 1 日から数えた現在までの日数より少ない場合は、ユーザーはアカウントを使用する前にパスワードを変更する必要があります。
-W daysパスワードが失効する前にユーザーに警告を発する日数を指定します。
インタラクティブモードで chage を使用して、複数のパスワードエージングおよびアカウントの詳細を修正することもできます。以下のコマンドでインタラクティブモードに入ります。
chage <username>
以下は、このコマンドを使用したインタラクティブセッションの例です。
~]# chage juan
Changing the aging information for juan
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: 10
Maximum Password Age [99999]: 90
Last Password Change (YYYY-MM-DD) [2006-08-18]:
Password Expiration Warning [7]:
Password Inactive [-1]:
Account Expiration Date (YYYY-MM-DD) [1969-12-31]:
ユーザーの初回ログイン時にパスワードが失効するように設定できます。これにより、ユーザーはパスワードを直ちに変更するよう強制されます。
  1. 初期パスワードを設定します。デフォルトのパスワードを割り当てるには、シェルプロンプトで root として以下のコマンドを実行します。
    passwd username

    警告

    passwd ユーティリティーには、null パスワードを設定するオプションがあります。null パスワードの使用は便利ですが、安全性は極めて低くなります。これは、いかなる第三者でも、セキュアでないユーザー名を使用して最初にシステムにログインし、アクセスできるためです。可能な場合は、null パスワードの使用は避けてください。どうしても避けられない場合は、null パスワードでアカウントのロック解除を行う前に、ユーザーがログインできる状態にあることを常に確かめてください。
  2. パスワードを直ちに強制的に失効させるには、root として以下のコマンドを実行します。
    chage -d 0 username
    このコマンドは、パスワードが最後に変更された日付の値を 1970 年 1 月 1 日に設定します。パスワードエージングのポリシーが設定されていても、この値はパスワードを直ちに強制的に期限切れにします。
これで、ユーザーは初回ログイン時に新規パスワードを入力するよう要求されます。

4.1.2. アカウントのロック

Red Hat Enterprise Linux 7 では、pam_faillock PAM モジュールを使うとシステム管理者は特定回数のログイン失敗の後にユーザーアカウントをロックアウトすることができます。ユーザーログインの試行回数を制限する主な目的はセキュリティー措置であり、ユーザーアカウントのパスワード獲得を目的とする総当たり攻撃を防ぐためのものです。
pam_faillock モジュールを使うと、ログイン失敗はユーザーごとに /var/run/faillock ディレクトリー内の個別ファイルに保存されます。

注記

ログイン失敗のログファイルにおける行の順番は重要なものです。even_deny_root オプションが使用されている場合、この順番が変更されると root アカウントを含むすべてのユーザーアカウントがロックされます。
アカウントのロックを設定するには、以下の手順を実行します。
  1. root 以外のユーザーがログインに 3 回失敗した後にロックアウトし、その 10 分後にこのユーザーのロックアウトを解除するようにするには、2 つの行を /etc/pam.d/system-auth および /etc/pam.d/password-auth の各ファイルの auth セクションに追加します。編集後に、両方のファイルの auth セクション全体は以下のようになります。
    1 auth        required      pam_env.so
    2 auth        required      pam_faillock.so preauth silent audit deny=3 unlock_time=600
    3 auth        sufficient    pam_unix.so nullok try_first_pass
    4 auth        [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600
    5 auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
    6 auth        required      pam_deny.so
    行番号 2 および 4 が追加されました。
  2. 以下の行を上記の手順の両ファイルの account セクションに追加します。
    account     required      pam_faillock.so
  3. アカウントのロックアウトを root ユーザーにも適用するには、/etc/pam.d/system-auth および /etc/pam.d/password-auth の各ファイルの pam_faillock エントリーに even_deny_root オプションを追加します。
    auth        required      pam_faillock.so preauth silent audit deny=3 even_deny_root unlock_time=600
    auth        sufficient    pam_unix.so nullok try_first_pass
    auth        [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=600
    
    account     required      pam_faillock.so
ユーザー john がログインに 3 回失敗した後に再度ログインしようとすると、このユーザーのアカウントはこの 4 回目のログイン試行でロックされます。
[yruseva@localhost ~]$ su - john
Account locked due to 3 failed logins
su: incorrect password
複数回のログイン失敗後でもユーザーがロックアウトされないようにするには、以下の行を /etc/pam.d/system-auth および /etc/pam.d/password-auth の各ファイルで pam_faillock が最初に呼び出される行のすぐ上に追加します。また、user1user2、および user3 を実際のユーザー名で置き換えます。
auth [success=1 default=ignore] pam_succeed_if.so user in user1:user2:user3
ユーザーあたりの実際の失敗回数を表示するには、root で以下のコマンドを実行します。
[root@localhost ~]# faillock
john:
When                Type  Source                                           Valid
2013-03-05 11:44:14 TTY   pts/0                                                V
ユーザーのアカウントをロック解除するには、root で以下のコマンドを実行します。
faillock --user <username> --reset

authconfig でのカスタム設定の保持

authconfig ユーティリティーを使って認証設定を修正すると、system-auth および password-auth の各ファイルは authconfig ユーティリティーからの設定で上書きされます。これを避けるには、設定ファイルの代わりにシンボリックリンクを作成します。このリンクを authconfig が認識し、上書きが避けられます。設定ファイル内のカスタム設定と authconfig を同時に使うには、以下の手順でアカウントロックを設定します。
  1. system-auth および password-auth ファイルがすでに system-auth-ac および password-auth-ac を参照しているシンボリックリンクであるかどうかを確認します (これはシステムデフォルト)。
    ~]# ls -l /etc/pam.d/{password,system}-auth
    出力が以下のような内容である場合、シンボリックリンクは問題なく設定されているため、手順 3 に進むことができます。
    lrwxrwxrwx. 1 root root 16 24. Feb 09.29 /etc/pam.d/password-auth -> password-auth-ac
    lrwxrwxrwx. 1 root root 28 24. Feb 09.29 /etc/pam.d/system-auth -> system-auth-ac
    system-auth および password-auth ファイルがシンボリックリンクでない場合は、次の手順に進んでください。
  2. 設定ファイルの名前を変更します。
    ~]# mv /etc/pam.d/system-auth /etc/pam.d/system-auth-ac
    ~]# mv /etc/pam.d/password-auth /etc/pam.d/password-auth-ac
  3. カスタマー設定を含む設定ファイルを作成します。
    ~]# vi /etc/pam.d/system-auth-local
    /etc/pam.d/system-auth-local ファイルに以下の行を記載します。
    auth        required       pam_faillock.so preauth silent audit deny=3 unlock_time=600
    auth        include        system-auth-ac
    auth        [default=die]  pam_faillock.so authfail silent audit deny=3 unlock_time=600
    
    account     required       pam_faillock.so
    account     include        system-auth-ac
    
    password    include        system-auth-ac
    
    session     include        system-auth-ac
    ~]# vi /etc/pam.d/password-auth-local
    /etc/pam.d/password-auth-local ファイルに以下の行を記載します。
    auth        required       pam_faillock.so preauth silent audit deny=3 unlock_time=600
    auth        include        password-auth-ac
    auth        [default=die]  pam_faillock.so authfail silent audit deny=3 unlock_time=600
    
    account     required       pam_faillock.so
    account     include        password-auth-ac
    
    password    include        password-auth-ac
    
    session     include        password-auth-ac
  4. 以下のシンボリックリンクを作成します。
    ~]# ln -sf /etc/pam.d/system-auth-local /etc/pam.d/system-auth
    ~]# ln -sf /etc/pam.d/password-auth-local /etc/pam.d/password-auth
For more information on various pam_faillock configuration options, see the pam_faillock(8) manual page.

4.1.3. セッションのロック

日常の業務中にユーザーがワークステーションから離れなければならない時もあります。こういう場合は、特に十分な物理的セキュリティー対策がとられていない環境 (「物理的コントロール」 を参照) では、攻撃者にマシンに物理的にアクセスする機会を与えてしまいます。ノートパソコンの場合は特に、持ち運びが便利なので物理的な安全性が脅かされます。このリスクは、正しいパスワードが入力されないとシステムにアクセスできないようにするセッションロッキング機能を使うことで緩和できます。

注記

画面のロックがログアウトよりも優れている点は、ロックの場合は (ファイル転送といった) ユーザーのプロセスを続行できるという点です。ログアウトしてしまうと、このようなプロセスは中断してしまいます。

4.1.3.1. vlock を使った仮想コンソールのロック

仮想コンソールをロックする必要がある場合は、vlock というユーティリティーを使って実行できます。このユーティリティーをインストールするには、以下のコマンドを root で実行します。
~]# yum install vlock
インストール後は、新たなパラメーターなしで vlock コマンドを使えば、コンソールセッションはすべてロックできます。このコマンドでは、アクティブな仮想コンソールをロックしますが、他のセッションへのアクセスは可能です。ワークステーション上のすべての仮想コンソールへのアクセスを防止するには、以下のコマンドを実行します。
vlock -a
この場合、vlock がアクティブなコンソールをロックし、-a オプションが他の仮想コンソールへのスイッチを防ぎます。
詳細は vlock(1) man ページを参照してください。

重要

Red Hat Enterprise Linux 7 で現在利用可能な vlock のバージョンに関する既知の問題がいくつかあります。
  • このプログラムでは現在、root パスワードを使ったコンソールのロック解除ができません。詳細は BZ#895066 を参照してください。
  • コンソールをロックしても、画面およびスクロールバックバッファを削除しないので、それまでのコマンドやコンソールで表示された出力が、ワークステーションに物理的アクセスできれば誰でも見れることになります。詳細については、BZ#807369 を参照してください。

4.1.4. リムーバブルメディアの読み取り専用マウントの強制

リムーバブルメディア (USB フラッシュディスクなど) の読み取り専用マウントを強制するために、管理者は udev ルールを使用してリムーバブルメディアを検出し、blockdev ユーティリティーを使用してリムーバブルメディアを読み取り専用でマウントするよう設定できます。物理メディアの読み取り専用マウントの強制に必要な作業はこれだけです。

blockdev を使用したリムーバブルメディアの読み取り専用マウントの強制

すべてのリムーバブルメディアを読み取り専用でマウントするには、/etc/udev/rules.d/ ディレクトリー内に新しい udev 設定ファイル (80-readonly-removables.rules など) を以下の内容で作成します。
SUBSYSTEM=="block",ATTRS{removable}=="1",RUN{program}="/sbin/blockdev --setro %N"
上記の udev ルールにより、blockdev ユーティリティーを使用して、新しく接続されたすべてのリムーバブルブロック (ストレージ) デバイスが自動的に読み取り専用で設定されます。

新しい udev 設定の適用

これらの設定を有効にするには、新しい udev ルールを適用する必要があります。udev サービスは設定ファイルの変更を自動的に検出しますが、新しい設定は既存のデバイスに適用されません。新しく接続されたデバイスのみが新しい設定の影響を受けます。したがって、新しい設定をリムーバブルディスクに適用するには、接続されたすべてのリムーバブルメディアをアンマウントし、取り外す必要があります。
すべてのルールを既存のデバイスに強制的に再適用するよう udev を設定するには、root で以下のコマンドを実行します。
~# udevadm trigger
上記のコマンドを使用して udev によってすべてのルールを強制的に再適用しても、すでにマウントされているストレージデバイスは影響を受けません。
udev によってすべてのルールを強制的にリロードするには (何らかの理由で新しいルールが自動的に検出されない場合)、以下のコマンドを使用します。
~# udevadm control --reload