setcapコマンドの詳細な説明

setcapコマンドの詳細な説明。Linuxでは、setcapコマンドの最も一般的な用途は、1024以上のポート(特権ポートとも呼ばれます)の使用を制限することです。ポート制限はファイアウォールを経由せずに実行できます。主な目的は、rootユーザーの権限を分割することです。つまり、root権限を異なる権限に分割し、それぞれが特定の特権操作を表すようにすることです。

setcapコマンドとは

Linuxの場合最も一般的な方法は、1024番以上のポート(特権ポートとも呼ばれます)の使用を制限することです。これらのポートはファイアウォールを経由せずに制限できます。主な目的は、ルートユーザーの権限を分割することです。つまり、ルート権限を異なる権限に分割し、それぞれが特定の特権操作を表すようにすることです。

Capabilitiesの主な考え方は、ルートユーザーの権限を分割することです。つまり、ルート権限を異なるケイパビリティに分割し、各ケイパビリティが特定の特権操作を表します。例えば、CAP_SYS_MODULEケイパビリティは、ユーザーがカーネルモジュールをロード(またはアンロード)できる特権操作を表し、CAP_SETUIDケイパビリティは、ユーザーがプロセスのユーザーIDを変更できる特権操作を表します。Capabilitiesでは、システムはプロセスのケイパビリティに基づいて特権操作へのアクセス制御を実行します。
Capilities では、プロセスと実行可能ファイルだけがケーパビリティを持ちます。各プロセスには、cap_effective、cap_inheritable、cap_permitted (それぞれ pE、pI、pP と略記) という 3 つのケーパビリティ セットがあります。このうち、cap_permitted はプロセスが持つ最大のケーパビリティ セットを表します。cap_effective はプロセスが現在使用できるケーパビリティ セットを表し、これは cap_permitted のサブセットと見なすことができます。cap_inheitable はプロセスが子プロセスに渡すことができるケーパビリティ セットを表します。システムはプロセスの cap_effective ケーパビリティ セットに基づいてアクセス制御を実行します。cap_effective は cap_permitted のサブセットです。プロセスは cap_effective の一部のケーパビリティを取り消すことで、プロセスの権限の一部を放棄できます。実行可能ファイルにも 3 つのケーパビリティ セットがあり、プロセスの 3 つのケーパビリティ セットに対応して、cap_effective、cap_allowed、cap_forced (それぞれ fE、fI、fP と略記) と呼ばれます。このうち、cap_allowed はプログラム実行時に元のプロセスの cap_inheritable から統合できる機能セットを表し、cap_forced はファイルの実行時にサービスを完了するために所有していなければならない機能セットを表し、cap_effective はファイルの実行開始時に使用できる機能を表します。
1. LinuxカーネルにおけるCapabilitiesの実装メカニズム
ケーパビリティの概念と仕組みはLinuxカーネルバージョン2.2以降に追加され、バージョンアップごとに徐々に改善されてきました。Linuxでは、ルート権限は以下の29のケーパビリティに分類されています。
CAP_CHOWN: ファイル所有者の権限を変更する
CAP_DAC_OVERRIDE: ファイルのDACアクセス制限を無視します
CAP_DAC_READ_SEARCH: ファイル読み取りとディレクトリ検索のDACアクセス制限を無視します
CAP_FOWNER: ファイル所有者IDがプロセスユーザーIDと一致しなければならないという制限を無視します。
CAP_FSETID: ファイルのsetuidビットの設定を許可します
CAP_KILL: 自分に属さないプロセスにシグナルを送信できるようにします
CAP_SETGID: プロセスのグループIDを変更できるようにする
CAP_SETUID: プロセスのユーザーIDの変更を許可する
CAP_SETPCAP: 他のプロセスへの権限の譲渡と他のプロセスからの権限の削除を許可します
CAP_LINUX_IMMUTABLE: ファイルのIMMUTABLEおよびAPPEND属性フラグの変更を許可します。
CAP_NET_BIND_SERVICE: 1024未満のポートへのバインドを許可する
CAP_NET_BROADCAST: ネットワークブロードキャストとマルチキャストアクセスを許可する
CAP_NET_ADMIN: ネットワーク管理タスクを実行できます
CAP_NET_RAW: 生のソケットの使用を許可する
CAP_IPC_LOCK: 共有メモリセグメントのロックを許可する
CAP_IPC_OWNER: IPC所有権チェックを無視する
CAP_SYS_MODULE: カーネルモジュールの挿入と削除を許可する
CAP_SYS_RAWIO: /devport、/dev/mem、/dev/kmem、およびrawブロックデバイスへの直接アクセスを許可します。
CAP_SYS_CHROOT: chroot() システムコールの使用を許可する
CAP_SYS_PTRACE: 任意のプロセスのトレースを許可します
CAP_SYS_PACCT: BSDスタイルのプロセス監査を可能にする
CAP_SYS_ADMIN: ファイルシステムのロードやアンロード、ディスククォータの設定などのシステム管理タスクを実行できます。
CAP_SYS_BOOT: システムの再起動を許可する
CAP_SYS_NICE: プロセスの優先度を上げたり、他のプロセスの優先度を設定したりすることができます
CAP_SYS_RESOURCE: リソース制限を無視する
CAP_SYS_TIME: システムクロックの変更を許可します
CAP_SYS_TTY_CONFIG: TTYデバイスの設定を許可します
CAP_MKNOD: mknod() システムコールの使用を許可する
CAP_LEASE: ファイルロックのFL_LEASEフラグの変更を許可します

 

例:

Wireshark をインストールするときの 1 つの手順は、dumpcap にネットワーク カードの読み取り権限を与えることです。これにより、一般ユーザーも Wireshark を使用してパケットをキャプチャできるようになります。
# setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/sbin/dumpcap

SetUID chmod u+s /path/to/application を使用する

ルート ユーザーとして、setcap コマンドを使用して、実行可能ファイル /bin/ping に「cap_net_admin、cap_net_raw+ep」権限を追加し、一般ユーザーが ping を使用できるようにします。
#setcap 'cap_net_admin,cap_net_raw+ep' /bin/ping

チェック:
[root@rhel671 ~]# getcap /bin/ping
/bin/ping = cap_net_admin、cap_net_raw+ep

注意: setcap は通常、バイナリ実行ファイルに使用されます。setcap は、スクリプトファイル (#!/bin/python で始まるスクリプトファイルなど) に使用すると無効になります。

1024 以内のポート:
setcap cap_net_bind_service=+eip /home/tengine/nginx/tengine/sbin/nginx

-r は追加の権限をクリアします:
setcap -r nginx

TOMCAT を設定して、非ルートユーザーが 1024 未満のポートを開始できるようにします。

setcap cap_net_bind_service=+eip /opt/tomcat/bin/startup.sh

スコア

手紙への返信

メールアドレスが変更されることはありません。 支払い欄に必須の項目は必須です