Lesson 7
セキュリティ
Lesson 7
Chapter 1
DACとMAC
Lesson6では、ユーザーがファイルやディレクトリへアクセス権を設定する方法について解説しました。 Lesson7では、ユーザーではなく、セキュリティーポリシーに基づくアクセス権設定について解説をします。 前者のようなユーザーの設定によるアクセス制御をDAC、後者のようなセキュリティーポリシーに基づくアクセス制御をMACと呼びます。 Chapter1では、DACとMACについて解説をします。
DAC(Discretionary Access Control)とは
Lesson6でご紹介したアクセス権の設定は、ユーザー自身がファイルやディレクトリに対して、ユーザーの属性ごとに「読取、書込、実行」とった権限を付与するものでした。 このようなアクセス制限方式をDAC(任意アクセス制御)と呼びます。
例えば、Lesson6でご紹介した下図ではユーザー名がuserであったり、ユーザーの属するグループ名がgroupであった場合には、sample.txtに対して「読取、書込」の権限が付与されていますが、この権限はユーザーが「chmod」コマンドで自由に設定できます。 また、「sudo」コマンドを用いて権限がルートユーザーに昇格すれば、どのようなファイルに対しても自由にアクセスすることが出来てしまいます。 このように、DACによるアクセス制限は自由度が高い反面、セキュリティ面において弱点が存在します。
MAC(Mandatory Access Control)とは
対してMAC(強制アクセス制御)は、あらかじめ定めたセキュリティーポリシーに従ってアクセス制限を行います。 例えば、あるプログラムが脆弱性を突かれ、root権限を乗っ取られた場合を考えてみてください。 DACのみでしかセキュリティー対策がされていない場合、root権限により全てのファイルにアクセスされ、影響がシステム全体に及んでしまいます。 対してMACによるセキュリティー対策は、セキュリティーポリシーと照らし合わせてアクセス制限を行うため、root権限を乗っ取られた場合でも影響を限定することが出来ます。
MAC(強制アクセス制御)を行うソフトウェアとしては、Linuxカーネル向けのSELinuxやWindows向けのUACといったものがあります。

Lesson 7
Chapter 2
SELinux
Chapter1では、MACがセキュリティーポリシーに基づいてファイルへのアクセスを制限していると記載しました。 では、セキュリティーポリシーに基づいたアクセス制御とは、具体的にどのように行うのでしょうか? Chapter2ではその点について、Linux向けのSELinuxを想定して解説していきます。
プロセスとは
SELinuxのセキュリティーポリシーについて解説するには、まずはプロセスという概念について説明する必要があります。
プロセスとは、実行中のプログラムのことです。 例えば今まで学習してきた「cat」や「ls」コマンドを実行すると、その都度プロセスが生成されます。
実行中のプロセスは以下のように「ps」コマンドに「aux」オプションを付けて確認することが出来ます。 試しに以下を実行してください。
$ ps aux
現在実行中の、「ps aux」には7174、「less」には7175といったID(PID)が与えられ、プロセスとして管理されています。 またUSERとしては、筆者がコマンドを実行した時のユーザーであるvboxuserが表示されています。 一番上のUSERがrootでPIDが1の「systemd」というプロセスは、CentOSが起動する時に一番初めに起動されるプロセスで、全ての元となっているプロセスです。
次に、SELinuxのセキュリティーポリシーについて、ご説明致します。
SELinuxのセキュリティーポリシー(AVルール)
SELinuxでは、全てのプロセスとOSの管理するファイルに「コンテキスト」というラベルを付けて分類します。 プロセスのコンテキストをソースコンテキスト(Source Context)、ファイルへのコンテキストをターゲットコンテキスト(Target Context)と呼びます。
そして、どのソースコンテキストがどのターゲットコンテキストにアクセスして良いかということを、セキュリティーポリシーとして定めているのです。 そのようなSELinuxのセキュリティーポリシーのことを、アクセスベクタールール(AVルール:Access Vector Rule)と呼びます。
では、下の図をご覧ください。 黄色箇所の「httpd_t」というラベルが付けられたソースコンテキストは、「httpd_sys_content_t」というラベルが付けられたターゲットコンテキストに、 アクセスすることが出来ますが、「init_exec_t」や「initrc_ecec_t」といったターゲットコンテキストにはアクセスできないように設定されています。 これがアクセスベクタールールでのアクセス制御です。
ここでアクセスベクタールールでは、プロセスを実行したユーザーが誰かといった情報からは、アクセスが制御されない点に着目してください。 これはどのような意義があるのでしょうか?
例えば悪意のある第三者が不正にルート権限を乗っ取り、何らかのプロセスを実行した場合を考えてみてください。 DACによるアクセス制限しか行っていなかった場合、そのプロセスで全てのファイルに対して操作をすることが出来てしまいます。 対してMAC(SELinux)によるアクセス制限をすることによって、ルート権限であってもセキュリティーポリシー上許されたファイルにしか操作をすることが出来なくなるのです。
「ドメイン(Domain)」と「タイプ(Type)」
プロセスに対するコンテキストを「ドメイン」、ファイル等のリソースに対するコンテキストを「タイプ」と呼ぶこともありますが、それぞれソースコンテキスト、ターゲットコンテキストと同じ意味です。
SELinuxで防げないセキュリティーの脅威
このようにSELinuxによるアクセス制限を実施することで、セキュリティー上のメリットを享受できますが、対処できない問題もあります。
それは、SELinuxは既に悪意のある第三者にプロセスを乗っ取られた後の防御手段を提供するものであるため、 乗っ取りそのものを防止する機能はないという点です。 従って、普段から「SSHでは公開鍵認証方式によって接続する」、「ファイアウォールを適切に設定する」、「ルートユーザーのパスワードを推測困難なように設定する」といった、 基本的なセキュリティー対策は抜かりなく行っていく必要があります。
「ファイアウォール」とは
ファイアーウォールとは、許可する・許可しない通信のルールを定めることで、外部ネットワークからの不正な通信を遮断する仕組みのことです。

Lesson 7
Chapter 3
SELinuxの状態管理
Chapter2では、SELinuxの概要とSELinuxを用いた場合にセキュリティーが一段階強化される点をご説明しました。 Chapter3では、実際にSELinuxを有効にする方法について解説していきます。
SELinuxの状態の確認
まずはSELinuxが有効になっているか、現在の状態を確認したいと思います。
su -
コマンドでルートユーザーにログインし、以下を実行してください。
下表のように、SELinuxには三つの状態があります。
getenforceコマンド実行後に「Enforcing」と表示された場合、SELinuxが有効になっているという意味になります。
# getenforce
Enforcing
設定 | 意味 |
---|---|
enforcing | 有効。違反するアクセスを拒否し、ログに書き出す。 |
permissive | 違反するアクセスを許可し、ログに書き出す。 |
disabled | 無効。違反するアクセスか否かの判定を行わない。 |
SELinuxの状態の変更方法
SELinuxが有効になっていなかった場合、設定ファイルを直接書き換え、サーバーを再起動することで設定を変更することが出来ます。
設定ファイルは/etc/selinux/config
というファイルです。
「su -
」コマンドでルートユーザーにログインしたのち、以下のように設定ファイルを開いてください。
# vim /etc/selinux/config
そして、開いたファイルにSELINUX=disabled
又はSELINUX=permissive
と記載されている箇所があると思います。
この箇所で以下書式のように状態を指定することで、SELlinuxの状態を変更することができます。
SELINUX=<状態>
SELinuxを有効にする場合は「/etc/selinux/config」ファイル内の
SELINUX=disabled
又はSELINUX=permissive
と記載された箇所を以下のように修正してください。
SELINUX=enforcing
その後、サーバーを再起動すれば設定が反映されます。サーバーを再起動するには以下のコマンドを実行してください。
$ systemctl reboot
再起動後、再度ルートユーザとして# getenforce
コマンドを実行し、SELinuxが有効になっていることを確認してください。
SELinuxを非有効化する場合
SELinuxの状態を非有効(permissive又はdisabled)な状態にしたい場合も、上でご紹介したのと同じように、直接ファイルを編集することで実施できます。
SELINUX=permissive
又はSELINUX=disabled
として適宜設定を変更してください。
サーバーを再起動しないで状態の変更をしたい場合
SELinuxの状態を変更するためには、上述したようにファイルの設定内容を修正したのち、サーバーを再起動する必要があります。 しかし、運用上サーバーを再起動したくない場合には、以下の方法でSELinuxの状態を変更することが出来ます。 ただしこの場合、設定変更後にサーバーを再起動すると、変更前の状態に戻ってしまうのでお気を付け下さい。 また、この場合は状態を「disabled」にしたり、「disabled」な状態を変更することは出来ません。
設定変更パターン | 実行するコマンド |
---|---|
enforcing → permissive | # setenforce 0 |
permissive → enforcing | # setenforce 1 |
終わりに
以上で本レッスンを終了します。Lesson6、Lesson7と合わせて、ファイルやディレクトリへのアクセス制御について学んできました。 次回のレッスンでは、システムのメンテナンスで必要となる「リソースの管理」について学んでいきます。
