Linuxの実行権限 setuid setgid及びsetcapについて考察
2020/01/06
2020/01/09
タグ: setcap, setgid, setuid, アクセス権限
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”なるファイルが存在するとして次のように指定します。
1 2 3 |
# chmod 4755 filter_test # ls -l -rwsr-xr-x 1 root vuser 75690 1月 3 12:18 2020 filter_test |
1 2 3 |
# chmod 2755 filter_test # ls -l -rwxr-sr-x 1 root vuser 75690 1月 3 12:34 2020 filter_test |
※もとの設定に戻す場合は先頭に”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を使って特定の権限を付与してあげる。次のような方法で行います。
1 |
# setcap cap_net_bind_service=+ep /usr/local/sbin/tiny_serv |
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 小プロセス生成の際は、権限を継承させる。