コンテンツにスキップ
Zenn Dev Akasara Articles 217e1a13f43004

nginxを非rootで80番ポートで動かす —Linux Capability入門

  • URL: https://zenn.dev/akasara/articles/217e1a13f43004
  • 日付: 2026-06-26
  • Tier: Tier 3
  • 要旨: Linuxでは従来「root全権か一般ユーザーか」の二択しかなかったが、Capability機能によってrootの特権を約40個に細分化し、必要なものだけを付与できる。nginx等を80番ポートで動かすにはCAP_NET_BIND_SERVICEだけあれば十分で、SUIDビットで全権を与える古いやり方より格段に安全だ。setcapコマンドで個別バイナリに権限を付与し、Effective/Permitted/Inheritableの3セットで管理する。systemd、Docker、Kubernetesいずれもこの仕組みで細粒度のセキュリティ設定が可能になっている。CAP_SYS_ADMINは「新しいroot」と呼ばれるほど広範であり付与は最終手段とすべきだ。

詳細

Linux Capability機能の実践解説。CAP_NET_BIND_SERVICEをPythonバイナリに付与して一般ユーザーで80番ポートにbindするデモをステップ形式で示している。

  • rootの全権を約40個の細かい権限に分解するのがCapabilityの本質(Linux 2.2以降)
  • setcapコマンドで付与、getcapで確認。=ep(Effective+Permitted)が標準的な付与形式
  • 3セット: Effective(今使えるか)、Permitted(使う権利)、Inheritable(子プロセス継承)
  • SUID vs Capability比較: SUIDはroot全権、Capabilityは選んだ権限のみ。現代のpingはCAP_NET_RAWでCapability運用に移行済み
  • systemdユニットファイルでの設定例: AmbientCapabilities=CAP_NET_BIND_SERVICE / CapabilityBoundingSet=CAP_NET_BIND_SERVICE
  • Docker: –cap-drop=ALL –cap-add=NET_BIND_SERVICE でNET_BIND_SERVICEだけ付与
  • Kubernetes: securityContext.capabilities.drop/addで指定(セキュリティ審査の頻出ポイント)
  • CAP_SYS_ADMINは実質rootと同等の広範な権限(マウント・sethostname等40以上のサブ機能)であり付与は厳禁
  • Capabilityはコピー時にxattrとして扱われるため、cp -a や tar –xattrsで保持が必要
  • /proc/self/statusのCapフィールド、capsh –decodeでデコード可能
  • 監査: sudo getcap -r / 2>/dev/null でシステム全体のCapability付きファイルを確認