Control)と呼ばれるセキュリティを強化する機能が標準で搭載されています。この強制アクセス制御機能を活用することで、サーバに不正侵入を許した場合でも被害を限定化するなどリスクを低減することができます。LinuxやFedoraといった主要ディストリビューションに標準実装されているSELinuxについて紹介します。SELinuxの概要SELinuxとは、アメリカ国家安全保障局(NSA)が中心となって開発した、Linuxのカーネルに強制アクセス制御を付加するモジュールです。Linux、CentOS、Fedoraのカーネルに標準で組み込まれています。強制アクセス制御は、「誰が何にどのようにアクセスできるか」というセキュリティポリシーに従ったアクセス制御を強制します。このアクセス制御はホワイトリスト形式となっており、あらかじめ定義したアクセスルール以外のアクセスについてはすべて拒否します。Control)ではroot特権によりすべてのファイルにアクセスが可能で、システム全体に影響が及んでしまいます。対してSELinuxが有効なシステムでは、強制アクセス制御(MAC)によりそのプロセスがアクセスできる範囲を限定します。結果、破壊活動を行おうとしてもアクセス拒否が発生し、動きを封じ込めることができます。この仕組みにより、SELinuxは定期的なパッチの適用が難しいシステムや、一般に知られない間に脆弱性が発生する「ゼロディ攻撃」などに有効であると言われています。SELinuxはサーバに侵入された後の被害を極小化させるものであり、侵入を防ぐものではありませんので、ファイアウォールや侵入検知システムなど侵入させないための仕組みが必要です。それでは、従来から利用されているDAC(任意アクセス制御)とMAC(強制アクセス制御)の違いについて見ていきましょう。DAC(任意アクセス制御)は、ログインユーザ情報とリソースの所有者情報を基にアクセス制御を行うものです。ファイルの所有者がパーミッションの設定を自由に変更できるほか、rootユーザは特権によりすべてのファイルにアクセスすることが可能です。一方のMAC(強制アクセス制御)は、セキュリティポリシーに従ったアクセス制限をrootユーザを含む全てのユーザやプロセスに強制させる仕組みです。セキュリティポリシーに登録されているアクセスルールはセキュリティ管理者のみが変更でき、ファイルの所有者でもアクセスルールを変更できないようになっています。この2つのアクセス制御の違いを簡単にまとめると、以下のようになります。プロセスに制限が掛かるため、root特権を奪われても影響範囲が限定される強制アクセス制御には様々なモデルが存在します。「誰が」の識別方法1つをとっても、プロセス毎の権限名で識別したり、ユーザの組織での役割名で識別したりします。SELinuxは以下のような複数の強制アクセス制御のモデルをサポートし、用途に応じてこれらを適切に構成することで、システムの各要素に最小限の権限を持たせ、結果として攻撃された場合の被害を最小化することができます。以降では、SELinuxの強制アクセス制御を構成するそれぞれのアクセス制御モデルについて見ていきます。Enforcement)TEは、SELinuxの強制アクセス制御として最も主要なものです。プロセスがリソースにアクセスする権限を制御する機能で、定義したアクセスルールはセキュリティポリシー・ファイルに保存されています。SELinuxを導入したシステムでは、セキュリティコンテキストと呼ばれるラベルがシステム上の全てのプロセスやリソースに割り当てられます。ラベルには主にプロセスに割り当てられるドメインとリソースに割り当てられるタイプがあり、このドメインからタイプにアクセス権を定義してアクセス制御を行う仕組みになっています。Control)RBACは、システム管理者やWeb管理者、DB管理者のような、ロールと呼ばれる役割に応じたアクセス権をユーザに付与することでアクセス制御を行う機能です。ログインユーザに対しても操作可能な範囲を制限することができます。RBACには、デフォルトで以下のような運用管理向けのロールが準備されています。auditサブシステムに関連するプロセスの管理が可能これらのロールを上手く利用すると、例えばrootユーザに制限をかけることも可能になります。デフォルトで準備されているロールが実際の運用体制に合わない場合は、必要に応じて独自のロールを作成することもできます。RBACについては本稿の執筆時点であまり文献が出回っていないため、ここでRBACの仕組みを詳しく解説します。OSにログインするLinuxユーザにSELinuxの制限を掛けるため、LinuxユーザはSELinuxポリシーによりSELinuxユーザ、ロール、ドメインにマッピングされます。-Zコマンドを実行すると、以下のように表示されます。この場合、rootユーザはSELinuxユーザ:unconfined_u、ロール:unconfined_r、ドメイン:unconfined_tにマッピングされています。このマッピングされたドメインをサブジェクト(動作主体)として、TEによりアクセス制御が行われます。Linuxユーザにマッピング可能なSELinuxユーザと、それぞれの権限は以下のとおりです。全項目で制限を受けないユーザだとわかります。なっており、ほぼ制限を受けません。telnetやsshなどでコンソールログインすると、rootユーザは何でもできる状態になっています。rootユーザは攻撃者に狙われやすいため、何らかの制限を掛けることが望ましいです。今回はrootユーザのsuやsudo権限にも制限を掛けるため、rootユーザにマッピングするSELinuxユーザはuser_uを使用します。ロールとドメインはuser_uに紐づく一般ユーザ権限のuser_rロール、user_tドメインを使用します。イメージとしては、下図のようになります。設定手順それでは、rootユーザの権限を制限してみましょう。SELinuxユーザマッピング設定を変更するために、現在の設定を確認します。*rootユーザのマッピング設定はunconfined_uです。これをuser_uに変更します。root変更後、SELinuxユーザマッピング設定がuser_uに変更されていることを確認します。*次に、SELinuxユーザとロールのマッピング設定を確認します。s0s0-s0:c0.c1023user_rこちらは、デフォルトでuser_rロールにマッピング設定されているので変更不要です。続いて、ログイン時に必要な読み取り権限と実行権限を付与します。ポリシーを追加するためのアクセスルール定義ファイル(teファイル)を作成します。/Login_user.te以下の内容のファイルを作成します。};次にポリシーモジュールを登録します。/tmp/work/Login_user.ppこれで設定の変更は完了です。rootユーザでログインすると、以下のように一般ユーザ権限に変更されています。–Zuser_u:user_r:user_t:s0また、通常運用時はrootユーザを一般ユーザ化しますが、システムメンテナンスなどの場面ではシステム管理者権限が必要になることがあります。このままではrootユーザはsuもsudoも使用できないため、SELinux管理者でログインし、rootユーザのマッピング設定を変更することで対応します。今回は、rootユーザにマッピングしているSELinuxユーザをstaff_uに変更し、rootユーザでログイン後にロールを変更してみます。イメージとしては、下図のようになります。設定手順まず、SELinuxユーザマッピング設定をstaff_uに変更するため、現在のSELinuxユーザマッピング設定を確認します。*rootユーザのマッピング設定をstaff_uに変更します。root変更後、SELinuxユーザマッピング設定がstaff_uに変更されていることを確認します。*最後に、SELinuxユーザとロールのマッピング設定を確認してみましょう。unconfined_rこれはstaff_uがstaff_r、sysadm_r、system_r、unconfined_rのロールを利用できるという設定です。今回必要な権限はsysadm_rなので設定を変更しなくても問題はありませんが、他のユーザでstaff_uをマッピングする用途がある場合は、制限がないunconfined_rを削除しておいた方が良いでしょう。unconfined_rのロールを削除するには、以下のコマンドを実行します。staff_u変更後のSELinuxユーザとロールのマッピング設定を確認するとunconfined_rが削除されています。system_r続いて、ログイン時に必要な読み取り権限と実行権限を付与します。ポリシーを追加するためのアクセスルール定義ファイル(teファイル)を作成します。/Login_staff.teまず、以下の内容のファイルを作成します。};次に、ポリシーモジュールを登録します。/tmp/work/Login_staff.ppこれで、設定の変更は完了です。rootユーザでログインすると、以下のように変更されました。–Zstaff_u:staff_r:staff_t:s0-s0:c0SELinuxユーザがstaff_uになったので、システム管理者ロールに切り替えることができます。権限昇格してみましょう。–Zコマンドで確認すると、ロールとドメインがシステム管理者のものに変更されました。これで、システムメンテナンス作業が可能になります。–Zstaff_u:sysadm_r:sysadm_t:s0-s0:c0なお、メンテナンス作業終了後は、速やかにマッピング設定を戻すことを忘れないようにしてください。今回の解説内容でrootユーザを一般ユーザ権限に変更することが可能ですが、動作を保証するものではありません。実際にシステムに適用する場合は、運用を考慮したユーザやロール、付与する権限について設計、テストを実施したうえで適用してください。今回はRBACについて簡単に解説するためユーザ名rootで直接ログインさせています。実運用時はsudoで一般ユーザを作成し、そのユーザにロールを付与するほうが望ましいです。Security)MCSはユーザやリソースなどにカテゴリというラベルを付与することで、カテゴリ別のアクセス制御を行うものです。ユーザがファイルなどのリソースにアクセスする際に部署ごとにアクセス制限を掛けるといったことに利用できます。現在はDockerやOpenShiftなどコンテナ間のセキュリティを保つために利用されるケースが主流です。企業ユーザで個別に設定して利用することはあまりないため、詳細は割愛します。Security)MLSは、カテゴリ別のアクセス制御(MCS)にレベル別のアクセス制御を追加した機能です。ユーザやプロセスがアクセス可能な範囲を詳細に制御でき、非常に高度なセキュリティを実現できます。運用や管理が大変で、強固なセキュリティを求められる国防/軍事システムなどで利用されるような機能と言えます。こちらも企業ユーザで個別に設定して利用することはあまりないため、詳細は割愛します。次回は、プロセスが乗っ取られた際に影響のある範囲をコマンドとツールを利用して調査する方法について解説します。システムの開発、金融系SEを経て、現在はOSSソリューションセンタに所属し、セキュリティ分野のOSSを活用したソリューション開発に従事している。ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。VeloCloudが選ばれる理由SD-WANとはなにか。Linuxエンジニア育成への思いF5とNGINXの組み合わせで、サービス公開をよりセキュアに。ITがお届けするポッドキャストです。