当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

ITエンジニアの技術力UPをお約束します。

Linuxの実行権限 setuid setgid及びsetcapについて考察

setuid,setgidって何?

Linuxサーバで中級レベルになってくるとよく使う設定かもしれません。簡単に言ってしまうと「一般ユーザがrootで実行できる権限を与える設定」を指します。setgidは設定されているグループ名のアクセス権で実行します。人によってはそれってセキュリテイ的にまずいんじゃないか!?って思う人もいるでしょう。実際そのとおりだと思います。故にこの設定は慎重に行うべきです。

様々なオープンソースを使っていると時々setuid 、setgidを使用するときがあります。私の作業しているケースで多いのはサーバアプリケーションがroot以外のユーザで動作させるケースやサーバと連携するプラグインやフィルターを使うケースで使います。これを使う際、常に思うことは「サーバ側のユーザで実行処理しているのか?それともそこだけrootなのか?」よくわからないなーと。

結局エラー内容を見るとアクセス権限がないとか、ファイルが見つかりませんとかの類のエラーが出てsetuid 、setgidの出番とお思います。一方で最近のサーバはセキュリティチェックが厳しいのでフォルダー、ファイルのアクセス権限が弱すぎるとそれはそれでエラーになってしまうケースも多いです。

権限を弱めないでサーバを設定するには

この問題を解決するにはずばりそのサーバ専用のフォルダーを”/”直下に作るべきなのかもしれません。そうすることでサーバにおける被害の範囲を狭めることが出来ます。setuid 、setgidを設定するバイナリーは良いとしてそのバイナリーがアクセスするフォルダーがどこにあるかでセキュリティの危険性が違ってきます。ログファイルの書き込み権限で問題になるケース、PIDファイルの置き場、データベースファイルの置き場で問題になるケースが兎に角多い。無理なフォルダー設定は必ず別のサーバにも影響を与えるため、そのサーバだけの範囲に収める必要があると思います。アクセスするファイルの場所によってはバイナリーがsetuidでないと絶対駄目なケースもありますが、setuidを設定するよりも先にsetgidでやれないか検討してみるのも良いと思います。

setuid,setgidの設定方法

chmodのアクセス権限(8進数)の先頭に”4″を付加するとsetuidになる。 例えば実行ファイル”filter_test”なるファイルが存在するとして次のように指定します。 chmodのアクセス権限(8進数)の先頭に”2″を付加するとsetgidになる。

※もとの設定に戻す場合は先頭に”0″を付加します。例えば”chmod 0755 ファイル名”のようにします。

setcapでroot 権限を細かく設定する使い方。

setcapを使う機会は私の中ではアプリケーションレベルで80番ポート、443番ポートのサーバを建てる時によく使う。この設定は前述のsetuid,setgidに似ているがより細かい設定が行える。最近使った中ではCaddy高速WEBサーバの設定の中で使用しました。caddy WEBサーバの基本はcaddy専用ユーザを作ってそのユーザで起動するのが普通だ。でも普通ユーザで実行する場合は特権ポートである80番、443番では取得できない。ではどうするかだが、setcapを使って細かいレベルのroot権限許可を与えればよいのである。

【使用例】

setcapは色々な設定属性をサポートしている。具体的な詳細はcapabilitiesマニュアルを読んでください。例えばC言語やC++、Go言語、Java言語で作成したバイナリープログラム「tiny_serv」を作ったと仮定する。そのサーバは安全のため一般ユーザで動作させるが、それだと80番、443番ポートの特権ポートが使えない。そこでsetcapを使って特定の権限を付与してあげる。次のような方法で行います。

Capabilitiesオプションの使い方は下記を参照されたし。

Capabilitiesリスト一部抜萃

  • CAP_AUDIT_CONTROL
  • CAP_AUDIT_READ
  • CAP_AUDIT_WRITE
  • CAP_BLOCK_SUSPEND
  • CAP_DAC_OVERRIDE
  • CAP_NET_BIND_SERVICE
  • CAP_DAC_READ_SEARCH
  • CAP_KILL
  • CAP_SYS_CHROOT
  • CAP_CHOWN

Allowanceの設定

“-“は解除を意味し、”+”は適用を意味する。

  • e: Effective 権限が適用される。活性化する
  • p: Permitted 権限が許可されている
  • i: Inherited 小プロセス生成の際は、権限を継承させる。