物理的なセキュリティ確保はとても重要です。 Linux の本番サーバは、セキュリティチェックを通過した人間のみがアクセスできる、鍵のかかったデータセンター内に配置されるべきです。環境や状況にもよりますが、ブートローダに対してパスワードを設定することも検討すべきです。
上記に加えて、下記を考慮する必要もあります:
ホストに対して直接アクセスできるのは誰か?
その彼らがすべきことは?
ホストを改ざんから保護することができるか?
特定のシステムにおける物理的なセキュリティは、そのシステムが配置されている状況に依存して決まるほか、利用可能な予算によっても大きく異なります。
データセンター内のほとんどのサーバラックには施錠の機能が備わっています。通常はラックの前面に掛け金やシリンダー錠の形式で用意され、施錠や解錠を行うことで内部へのアクセスを許可したり禁止したりすることができます。かご形のラックであればサーバからデバイスを不正に差し替えたり抜きとったりすることを防げますし、筐体を開けたり妨害したりすることも防ぐことができます。また、システムを不正に再起動されたり、代替デバイス (例: CD/DVD/USB メモリなど) から起動できたりしないようにすることも重要です。
サーバによってはケースロック (施錠) を備えているものもあります。これらのロックはシステムの製造元や構造によって異なるもので、ほとんどのケースロックは筐体を開けなくする目的で提供されていますが、キーボードやマウスなどを接続できないようにするものもあります。施錠は便利な仕組みではありますが、安全性という観点では低く、悪意のある人間であれば難なく突破できてしまう程度の仕組みでもあります。
本章では起動処理の安全性を高めるための基本的な方式のみを説明しています。 UEFI を利用したより高度な起動保護方法や Secure Boot 機能そのものの説明については、 14.1項 「Secure Boot」 をお読みください。
BIOS (Basic Input/Output System) やその後継である UEFI (Unified Extensible Firmware Interface) は PC システムで最も低い位置にあるソフトウエア/ファームウエアです。 Linux の動作する他のハードウエアタイプ (POWER, IBM Z) にも、 PC BIOS と似たような機能を持つ低レベルのファームウエアがあります。この文書内で "BIOS" と記述した場合、通常は BIOS と UEFI の両方を意味します。 BIOS はシステムの設定を構成して一定の状態にするほか、低レベルなハードウエア機能も提供します。 BIOS はその後、ホストを起動するための Linux ブートローダ (例: GRUB 2) を開始します。
ほとんどの BIOS 実装には、システムの不正な操作や不正な起動設定を防止するための機能が用意されています。一般には BIOS 管理者パスワードや起動パスワードなどと呼ばれています。管理者パスワードはシステムの設定を変更する際に求められるパスワード、起動パスワードは通常の起動を行う際に求められるパスワードです。ほとんどの場合、管理者パスワードのみを設定し、内蔵のハードディスクからのみ起動するよう設定すれば十分です、これにより、 Linux のライブ CD や USB メモリなどを挿入もしくは接続して不正に起動するのを防ぐことができます。ただし、 BIOS は高度なセキュリティを提供するものではなく、筐体を開くだけで容易に BIOS をリセットできたりパスワードを削除もしくは変更できたりしてしまうため、他の仕組みと組み合わせて使用する必要があります。
多くの BIOS ファームウエアには、それ以外のセキュリティ関連の設定が用意されています。システムの製造元や提供されているマニュアル、もしくは BIOS のメニューなどを参照して、どのような設定ができるのかをご確認ください。
システムに対して起動パスワードを設定すると、そのシステムは無人では起動しなくなってしまいます (たとえばシステムの再起動や電源障害などの場合、自動では起動しなくなってしまいます。これは安全性と利便性のトレードオフとなります。
システムを初めて設定したような場合、 BIOS の管理者パスワードはそれほど頻繁に入力する必要はありません。そのため、パスワードを忘れてしまわないように注意してください。パスワードを忘れてしまった場合、再度アクセスできるようにするには、ハードウエア側の操作を行って BIOS の設定を消去する必要があります。
openSUSE Leap の既定で使用される Linux のブートローダ GRUB 2 には、起動パスワードを設定する機能が用意されています。パスワード機能を利用することで、管理者のみが対話的な操作 (例: メニュー項目の編集やコマンドラインインターフェイスでの入力など) を行うことができるようにすることができます。またパスワードを指定した場合、 C および E を押して正しいパスワードを入力するまで、いかなる対話的な操作も禁止されるようになります。
詳しい設定については、 GRUB 2 のマニュアルページをお読みください。
なお、パスワードを設定するにあたっては、設定したパスワードを忘れてしまわないように注意してください。また、パスワードを設定しても、侵入への時間を稼ぐことができるだけであって、完全に防げるわけではないことにも注意してください。たとえばリムーバブルデバイスから起動できる環境であれば、リムーバブルメディアを挿入してルートパーティションをマウントできてしまいます。このような場合は、 BIOS レベルのセキュリティとブートローダのセキュリティの両方を使用することで、リムーバブルメディアからの起動を禁止して、かつ BIOS と起動の両方をパスワードで保護することができるようになります。
このほか、ブートローダの設定ファイルには適切なパーミッション 600
(root
のみが読み書きできる) を設定して保護する必要もあります。保護を行わないと、パスワードやハッシュを読み取られてしまいます。
セキュリティポリシーには通常、廃棄予定のストレージメディアの取り扱いに関する規定も記述されています。ディスクやメディアの消去手順は、メディアの完全破壊としてもよく知られています。インターネット上にはさまざまなツールが提供されていますので、 「ディスク 消去 ユーティリティ」 などで検索を行うと、それらのツールに関する説明を読むことができます。機密データを含むサーバを廃棄する場合、ディスク内に書かれていたデータを修復できないようにすることが重要です。全てのデータの痕跡を消去するには、 scrub
などのユーティリティをお使いください。多くの消去ツールは、データ領域に上書きで何度も書き込むことによって消去を行います。これにより、高度な方法でデータにアクセスしようとしても、データを全く読み取れなくなります。ツールによっては単独で起動できる媒体が提供されているものや、アメリカ国防総省 (U.S. Department of Defense) 標準に準拠してデータを消去する機能を備えているものもあります。なお、それぞれの政府機関では独自に消去標準を策定しています。標準によってはそれより強力なものもありますが、強力であればあるほど時間のかかるものであることに注意してください。
SSD などのデバイスにはウエアレベリングと呼ばれる仕組みがあり、データの上書きを行っても同じ場所に書き込まれるとは限らないものがあります。このようなデバイスの場合は、独自の機能を利用して消去する必要があります。
scrub
コマンドはハードディスクやファイルのほか、その他のデバイスに対しても利用可能なユーティリティで、データの復元を難しくするために繰り返しパターンを書き込むことで上書きを行います。このユーティリティは 3 種類のいずれかのモードで動作させることができます。モードはキャラクタ/ブロックデバイス、ファイル、ディレクトリのいずれかです。詳しくは man 1 scrub
で表示されるマニュアルページをお読みください。
国家核安全保障局 (NNSA) が NAP-14.1-C (XVI-8) として規定される方式で、リムーバブルメディアや非リムーバブルメディア (ハードディスク) に対応しています。全ての場所に対して擬似乱数パターンを 2 回、その後既知のパターンを書き込む 4 パス型の方式です: 乱数 (x2), 0x00, 書き込み検証
DoD 5220.22-M section 8-306 procedure (d) として規定される方式で、リムーバブルメディアや非リムーバブルメディア (ハードディスク) に対応しています。書き込み可能な全ての範囲に対して、特定の文字、その反転パターン、ランダムな文字をそれぞれ書き込んで、最後に検証を行う 4 パス型の方式です。注意: scrub では書き込み検証を容易に実施できるよう、乱数のパスを最初に実行します: 乱数, 0x00, 0xff, 書き込み検証
German Center of Security in Information Technologies ( https://www.bsi.bund.de ) が推奨する 9 パス型の方式です: 0xff, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f
Gutmann 氏の論文で示された方式で、合計 35 パスの手順を踏む方式です。
Bruce Schneier 氏の "Applied Cryptography" (1996) で示された 7 パス型の方式です: 0x00, 0xff, 乱数 (x5)
Roy Pfitzner 氏による 7 乱数パス型の方式です: 乱数 (x7)
Roy Pfitzner 氏による 33 乱数パス型の方式です: 乱数 (x33)
アメリカ陸軍の AR380-19 方式です: 0x00, 0xff, 乱数 (注意: 磁気コアメモリを消去する場合は、 DoD 522.22-M section 8-306 procedure (e) と等価になります)
1 パス型のパターンです: 0x00
1 パス型のパターンです: 0xff
1 パス型のパターンです: 乱数 (x1)
2 パス型のパターンです: 乱数 (x2)
バージョン 1.7 以前の scrub と同じ 6 パス型の方式です: 0x00, 0xff, 0xaa, 0x00, 0x55, 書き込み検証
5 パス型の方式です: 0x00, 0xff, 0xaa, 0x55, 書き込み検証
1 パス型の独自パターンです。 (文字列) には C 形式の数値エスケープ (\nnn (8 進数) もしくは \xnn (16 進数)) を記述することができます。
環境によっては、 USB ストレージや光学メディアなどのリムーバブルメディアへのアクセスを制限する必要があることがあります。このような場合は、 udisks2
パッケージを利用することで、設定を行うことができます。
まずはリムーバブルメディアをマウントしたり取り出したりすることができるユーザグループを作成します。下記の例では、 mmedia_all というグループを作成しています:
>
sudo
groupadd mmedia_all
次に tux
を新しいグループに追加します:
>
sudo
usermod -a -G mmedia_alltux
/etc/polkit-1/rules.d/10-mount.rules
ファイルを作成して、下記のような内容を記述します:
>
cat /etc/polkit-1/rules.d/10-mount.rules
polkit.addRule(function(action, subject) {
if (action.id =="org.freedesktop.udisks2.eject-media"
&& subject.isInGroup("mmedia_all")) {
return polkit.Result.YES;
}
});
polkit.addRule(function(action, subject) {
if (action.id =="org.freedesktop.udisks2.filesystem-mount"
&& subject.isInGroup("mmedia_all")) {
return polkit.Result.YES;
}
});
ルールファイルのファイル名は必ず数字で始まっていなければなりません。数字で始まっていないファイル名の場合、そのファイルは無視されます。
ルールファイルはアルファベット順に処理されます。関数はいずれかの関数が値を返すまで、処理された順序で実行されます。そのため、特定のルールよりも前に処理させたい認可ルールがある場合は、そのルールファイルよりも前に並ぶファイル名を設定して /etc/polkit-1/rules.d 内に配置してください。たとえば /etc/polkit-1/rules.d/10-mount.rules
のようになります。また、それぞれの関数は polkit.Result
の値を返す必要があります。
udisks2
を再起動します:
#
systemctl restart udisks2
polkit
を再起動します
#
systemctl restart polkit
USBGuard ソフトウエアフレームワークは、 USB デバイスの認可を強制することによって、お使いのシステムを保護する機能を提供します。このフレームワークは、デバイスの属性情報をベースにした許可/拒否リストを使用します。
USBGuard には下記のような機能があります:
動作中の USBGuard デーモンとの対話を行うためのコマンドラインインターフェイス
動的な処理やポリシー強制を行うためのプロセス間通信 (IPC) 機能を持ったデーモンコンポーネント
USB デバイスの認可ポリシーを記述するためのルール言語
共有ライブラリとして提供された、デーモンコンポーネントとの対話を行うための C++ API
USBGuard デーモンは、ポリシー内に規定されたルールをもとに、 USB デバイスの使用可否を判断します。 USBGuard をインストールして設定するには、下記のコマンドを使用してください:
USBGuard をインストールするには、下記の手順を実施します:
>
sudo
zypper install usbguard
これで USBGuard と必要な依存関係がインストールされます。 USBGuard サービスとの対話を行うには、 usbguard-tools
も合わせてインストールしてください。
現在接続されている USB デバイスを元にしてルールセットを生成したい場合は、 root
に切り替えて下記のコマンドを実行します:
#
usbguard generate-policy > /etc/usbguard/rules.conf
あとは必要に応じて /etc/usbguard/rules.conf
ファイルを編集し、 USBGuard のカスタマイズを行ってください。
USBGuard の開始やシステム起動時の自動開始を設定したい場合は、 root
に切り替えて下記のコマンドを実行します:
#
systemctl enable --now usbguard.service
なお、 USBGuard ではデバイスの許可か拒否をそれぞれ設定することができます。これは usbguard-daemon.conf
ファイル内の ImplicitPolicyTarget
オプションの値によっても影響を受けますが、これはポリシー内のどのルールにも該当しなかった場合の取り扱いを指定します。
usbguard allow-device 6
usbguard block-device 6
システムへの接続を拒否してデバイスを取り外したい場合は、 reject-device
オプションを設定してください。
なお、全てのオプションを確認したい場合は、 usbguard --help
コマンドを実行してください。
デバイスの属性をベースにして allow (許可) または block (拒否) を設定することで、お使いのシステムに対する USB デバイスの接続ポリシーを設定することができます。
USBGuard はコマンドラインオプションの解釈とデーモンへの設定適用が完了すると、 usbguard-daemon.conf
ファイルの読み込みを行います。このファイルは /etc/usbguard/usbguard-daemon.conf
に配置します。このファイルには下記のようなオプションが含まれています:
RuleFile=パス
USBGuard デーモンは、このファイルをポリシールールセットの読み込み元として使用するほか、 IPC (プロセス間通信) で指示された新しいルールの書き込み先としても使用します。既定値は %sysconfdir%/usbguard/rules.conf
になります。
ImplicitPolicyTarget= ターゲット
ポリシー内のどのルールにも該当しないデバイスの取り扱い方法を指定します。たとえば下記のようになります:
allow - デバイスの接続を許可します
block - デバイスの接続を拒否します
reject - システムからデバイスノードを論理的に削除します
PresentDevicePolicy= ポリシー
デーモンの起動時に既に接続されていたデバイスの取り扱い方法を指定します。
allow - デバイスの接続を許可します
block - デバイスの接続を拒否します
reject - デバイスを削除します
keep - 内部状態を同期させます
apply-policy - 全ての既存デバイスに対して、ルールセットを適用します
IPCAllowedUsers= ユーザ名
デーモンに対して IPC 経由でコマンドの送信を許可するユーザ名を、スペース区切りで指定します。
IPCAllowedGroups= グループ名
デーモンに対して IPC 経由でコマンドの送信を許可するグループ名を、スペース区切りで指定します。
IPCAccessControlFiles= パス
IPC のアクセス制御設定ファイルとしてデーモンが解釈すべきファイルパスを指定します。
IPCAllowedUsers=root joe IPCAllowedGroups=wheel
たとえば上記のような例の場合、 root
, joe
の各ユーザ、および wheel
グループに属するユーザからの全ての IPC を許可します。
USBGuard に関するさらに詳しい情報を参照したい場合は、それぞれ下記をご覧ください:
提供元のドキュメンテーション: https://usbguard.github.io/
man usbguard
man usbguard-rules.conf
man usbguard-daemon
man usbguard-daemon.conf