砂漠を旅する中で、興味深い二つの大地の違いに遭遇した。忘れないうちに、この羊皮紙に記しておくとしよう。
Rocky Linuxという名の厳格な大地にNginxという名の新たな拠点(Webサーバー)を築いた。 順風満帆に見えたその矢先、私は突如として「403 Forbidden」という、冷酷な結界(アクセス拒否エラー)に阻まれた。 しかし、不思議なことに、目に見えない守護者「SELinux」を眠らせると結界は嘘のように消え去るのだ。
さらに奇妙なことに、Ubuntuという自由な大地で同じ儀式を執り行っても、この結界は現れない。 なぜ、二つの大地でこれほどまでに景色が違うのか?この謎を解き明かすため、私は「SELinuxコンテキスト」という、古代の魔法体系の深淵を覗き込む決意をした。 これは、見えざる守護者の機嫌を損ねず、無事に拠点を築き上げるための、実践的な魔導書である。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 砂漠の道標
- 第一の冒険:Rocky Linuxという厳格な大地
- 第二の冒険:Ubuntuという自由な大地
- 羊皮紙を巻く前に
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- Rocky Linux(またはCentOS系)という大地で、SELinuxという名の見えざる守護者に道を阻まれた者
- 「403 Forbidden」の結界に悩まされ、その真の原因を探求する者
- SELinuxコンテキストという、難解な魔法体系の断片に触れてみたい冒険者
- Rocky LinuxとUbuntuのセキュリティ思想の違いを知りたい旅人
砂漠の道標
- SELinux(Security-Enhanced Linux) - Linuxカーネルに組み込まれた強制アクセス制御機構。ファイルやプロセスに「コンテキスト」という属性を付与し、厳密なアクセス制御を実現する。
- SELinuxコンテキスト - ファイルやプロセスに付与される「user:role:type:level」形式のラベル。typeが最も重要で、アクセス可否の判定に使われる。
- 403 Forbidden - Webサーバーがアクセス権限不足によりコンテンツ表示を拒否した際に返すHTTPエラーコード。
- httpd_sys_content_t - NginxやApacheが読み取り可能なファイルに必要なSELinuxタイプ。Webコンテンツの正規ラベル。
- user_home_t - ユーザーのホームディレクトリ配下のファイルに付与されるSELinuxタイプ。Webサーバーからはアクセス不可。
- chcon - SELinuxコンテキストを一時的に変更するコマンド。恒久的な変更にはsemanageを使用。
- firewall-cmd - firewalldを操作するコマンド。Rocky LinuxなどRHEL系ディストリビューションの標準ファイアウォール管理ツール。
第一の冒険:Rocky Linuxという厳格な大地
まずはRocky Linux 9.4という大地で、Nginxの拠点(Webサーバー)を築く儀式を執り行う。
この大地は厳格で、初期状態では一般人にsudoという神の力(管理者権限)の一部さえ与えてくれない。
まずはrootとなり、usermodで自らに力を授ける儀式から始めねばならない。
Nginxをインストールし、サービスを起動する。
しかし、このままではまだ外界から拠点を訪れることはできない。
firewall-cmdという呪文(ファイアウォール管理コマンド)で見えざる炎の壁に風穴を開け、HTTPの通り道を確保せねばならない。
$ sudo firewall-cmd --permanent --zone public --add-service http $ sudo firewall-cmd --reload
この儀式を終えて初めて、我々はブラウザという魔法の水晶玉を通して、美しいホームページを拝むことができるのだ。
結界の発動
問題はここからだ。
自分のホームディレクトリで作成した羊皮紙(sample.html)をNginxのドキュメントルート(/usr/share/nginx/html/test)へ移した途端、例の「403 Forbidden」という結界が発動する。
謎の解明:SELinuxコンテキストという「刻印」
ls -Zという真実の目(SELinuxコンテキスト表示コマンド)で見ると、その原因は一目瞭然だった。
私が持ち込んだ羊皮紙にはuser_home_tという「故郷の刻印」が押されていた。
しかし、Nginxの神殿に入れるのはhttpd_sys_content_tという「聖なる刻印」を持つものだけ。
これが守護者が怒った理由だ。
# 故郷の刻印が押された、私の羊皮紙 $ ls -Z /usr/share/nginx/html/test/sample.html unconfined_u:object_r:user_home_t:s0 /usr/share/nginx/html/test/sample.html # 神殿に元からあった、聖なる刻印を持つ羊皮紙 $ ls -Z /usr/share/nginx/html/index.html system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html/index.html
結界を解く呪文
解決策はchconという呪文(コンテキスト変更コマンド)で羊皮紙に押された刻印を聖なるものへと書き換えることだ。
$ chcon -t httpd_sys_content_t /usr/share/nginx/html/test/sample.html
これで守護者の機嫌は直り結界は解かれ、私の羊皮紙は無事に衆目に晒されることとなる。
第二の冒険:Ubuntuという自由な大地
次に舞台をUbuntu 24.04という自由な大地に移す。
こちらの大地は寛容で、最初からsudoの力が使え、ファイアウォールの門も初期状態では開かれている。
Rocky Linuxと全く同じ手順で、自分のホームから羊皮紙を移す。 …すると、どうだろう。 何事もなかったかのように、あっさりと表示されるではないか。
真実の目で確認すると、ls -Zは?を返すのみ。
この大地では、そもそもSELinuxという守護者自体が、初期状態では眠りについているようだった。
$ ls -Z /var/www/html/test/sample.html ? /var/www/html/test/sample.html
羊皮紙を巻く前に
Rocky LinuxとUbuntu。二つの大地を旅して見えたのは、それぞれの「哲学」の違いだった。Rocky Linuxは厳格な要塞、Ubuntuは自由な都市。どちらが優れているかではなく、自分が立つ大地の作法を理解することが、真の冒険者には求められる。
SELinuxコンテキストの本質
- user_home_tとhttpd_sys_content_tの違い - ファイルの「出自」を示す刻印であり、Nginxが読めるのは後者のみ
- chconによる刻印変更 - 一時的な対処として有効だが、恒久的な変更にはsemanageが必要
- Rocky LinuxとUbuntuの思想差 - 前者はセキュリティ重視の要塞、後者は利便性重視の自由都市
まとめ
SELinuxコンテキストは難解だが、その理を少しでも知ることはRockyという大地を旅する上で、必ずや我々の身を助けるだろう。見えざる守護者の機嫌を損ねず、無事に拠点を築く術を、あんたもぜひ身につけてほしい。
どうやらインクが切れそうだ。 今日の記録はここまでにして、道具の手入れでもするとしよう。
砂漠で見つけた魔法のランプ
- Rocky Linux | 公式の古文書
- Ubuntu 日本語 Remix | 賢者たちが記した、もう一つの古文書
ラクダの独り言
ご主人が「見えない守護者が怒ってる!」とか言って、黒い画面に呪文を打ち込んでいる。 俺に言わせりゃ、見えないもんにビビる前に、目の前で腹を空かせている俺の機嫌を取るべきだと思うんだがな。 まったく、人間ってのは面倒くさい生き物だぜ。 おっと、また腹が鳴っちまった。