たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

見えざる守護者の機嫌を伺え ~Rocky LinuxとUbuntu、SELinuxを巡る冒険~

砂漠を旅する中で、興味深い二つの大地の違いに遭遇した。忘れないうちに、この羊皮紙に記しておくとしよう。

Rocky Linuxという名の厳格な大地にNginxという名の新たな拠点(Webサーバー)を築いた。 順風満帆に見えたその矢先、私は突如として「403 Forbidden」という、冷酷な結界(アクセス拒否エラー)に阻まれた。 しかし、不思議なことに、目に見えない守護者「SELinux」を眠らせると結界は嘘のように消え去るのだ。

さらに奇妙なことに、Ubuntuという自由な大地で同じ儀式を執り行っても、この結界は現れない。 なぜ、二つの大地でこれほどまでに景色が違うのか?この謎を解き明かすため、私は「SELinuxコンテキスト」という、古代の魔法体系の深淵を覗き込む決意をした。 これは、見えざる守護者の機嫌を損ねず、無事に拠点を築き上げるための、実践的な魔導書である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • 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で自らに力を授ける儀式から始めねばならない。

Rocky Linux 9.4

儀式の舞台、Rocky Linux 9.4

Nginxをインストールし、サービスを起動する。 しかし、このままではまだ外界から拠点を訪れることはできない。 firewall-cmdという呪文(ファイアウォール管理コマンド)で見えざる炎の壁に風穴を開け、HTTPの通り道を確保せねばならない。

$ sudo firewall-cmd --permanent --zone public --add-service http
$ sudo firewall-cmd --reload

この儀式を終えて初めて、我々はブラウザという魔法の水晶玉を通して、美しいホームページを拝むことができるのだ。

Nginx ホームページ

厳格な大地に咲いた、一輪の花

結界の発動

問題はここからだ。 自分のホームディレクトリで作成した羊皮紙(sample.html)をNginxのドキュメントルート(/usr/share/nginx/html/test)へ移した途端、例の「403 Forbidden」という結界が発動する。

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の力が使え、ファイアウォールの門も初期状態では開かれている。

Ubuntu 24.04

もう一つの舞台、Ubuntu 24.04

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コンテキストの本質

  1. user_home_tとhttpd_sys_content_tの違い - ファイルの「出自」を示す刻印であり、Nginxが読めるのは後者のみ
  2. chconによる刻印変更 - 一時的な対処として有効だが、恒久的な変更にはsemanageが必要
  3. Rocky LinuxとUbuntuの思想差 - 前者はセキュリティ重視の要塞、後者は利便性重視の自由都市

まとめ

SELinuxコンテキストは難解だが、その理を少しでも知ることはRockyという大地を旅する上で、必ずや我々の身を助けるだろう。見えざる守護者の機嫌を損ねず、無事に拠点を築く術を、あんたもぜひ身につけてほしい。

どうやらインクが切れそうだ。 今日の記録はここまでにして、道具の手入れでもするとしよう。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が「見えない守護者が怒ってる!」とか言って、黒い画面に呪文を打ち込んでいる。 俺に言わせりゃ、見えないもんにビビる前に、目の前で腹を空かせている俺の機嫌を取るべきだと思うんだがな。 まったく、人間ってのは面倒くさい生き物だぜ。 おっと、また腹が鳴っちまった。