Linuxでは、root以外のユーザーが実行しているプロセスに特権を高める機能を割り当てることができます。
rootユーザーが実行するプロセスには利用可能なすべての機能がありますが、場合によってはこれらのプロセスから一部の機能を手動または自動で削除できますか?
答え1
はい、能力のアイデアは、ユーザーID自体が特別な能力を付与しないことです。 UID 0プロセスは不要な機能を排除することもできます。 UID 0(たとえば、/etc/shadow
または)/etc/ssh/sshd_config
が所有するファイルへのアクセスは維持され続けるため、別のUIDに切り替えるのが賢明かもしれません。
capsh
必要に応じて機能を削除できることを使用してテストできます。最後の部分はシェルスクリプトとして実行され、chown
ファイル所有者変更機能(CAP_CHOWN
)が削除されたために失敗することがわかります。
# capsh --drop=cap_chown -- -c 'id; touch foo; chown nobody foo'
uid=0(root) gid=0(root) groups=0(root)
chown: changing ownership of 'foo': Operation not permitted
これFunction(7) マニュアルページシステムには、機能に拘束されることなく永久に削除される特定の状況をうまく処理できない可能性があるsetuidバイナリに対するいくつかの保護機能があると述べました。 「機能的に愚かなバイナリの安全チェック」を参照してください。
もちろん、同じマニュアルページには、関数に関する他の有用な情報も含まれています。
答え2
あなたができるいくつかの異なることがあります。
カボチャの根
NFS共有はroot_squash
このフラグで使用できます。
この方法でネットワーク共有をマウントできますが、クライアントのrootユーザーはサーバー上でホストされているファイルへのrootアクセス権を取得できないため、NFSを使用できます。この場合、他のホストからファイルにアクセスできるようにすることができ、そのホストのユーザーがそのコンピュータのroot権限を持っていても、コンテンツは依然として安全です。
これは企業環境で便利です。たとえば、ネットワーク管理者が自分のデバイスログにアクセスできるようにしますが、変更することはできません。 Linux管理ボックスへのrootアクセス権を持っていても、ログを変更することはできません。
もっと読むには、私のお気に入りのガイドをご覧ください。http://fullautolinux.blogspot.com/2015/11/nfs-norootsquash-and-suid-basic-nfs.html
SSH
あなたができるいくつかの異なることがあります。たとえば、ルートがSSHを介してデバイスに接続するのを防ぐことができます。つまり、rootになるには、ユーザーが別のアカウント(作成した管理者アカウントなど)を使用してデバイスにアクセスし、同様のコマンドを使用してrootに切り替える必要がありますsu
。
簡単なガイドはここにあります:https://mediatemple.net/community/products/dv/204643810/how-do-i-disable-ssh-login-for-the-root-user
RHEL7/セントOS7
以下は、エンタープライズ環境でルートアカウントを制限する方法についてのRedhatのドキュメントです。 https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/sec-controlling_root_access
修正する:
他の回答で説明したように変更することもできます能力ルートアカウントの。
答え3
プログラムで機能セットを調整する
スレッドは capget(2) および capset(2) システムコールを使用して、対応する機能セットを検索および変更できます。ただし、これを行うには、libcapパッケージに提供されているcap_get_proc(3)とcap_set_proc(3)を使用することをお勧めします。次のルールは、スレッド機能セットの変更を管理します。
...
- 新しい権限セットは既存の権限セットのサブセットでなければなりません(つまり、スレッドが現在持っていない権限機能を取得することは不可能です)。
- 新しい有効なセットは、新しい許可セットのサブセットでなければなりません。
答え4
@ilkkachu 回答に情報を追加しています。
プロセスの機能によって、ユーザーに権限があるかどうかが判断されるようです。
cap_checkpoint_restore
たとえば、1つの機能()を除いてすべてを削除します。
capsh --drop=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read,cap_perfmon,cap_bpf -- -c 'sleep 10000'
cap_checkpoint_restore
ユーザーが次の場合でも、1つの能力しか持っていないことがわかりますroot
。
# ps aux | grep sleep
root 2309662 0.0 0.0 5768 1008 pts/5 S+ 07:21 0:00 sleep 10000
# cat /proc/2309662/status | grep Cap
CapInh: 0000000000000000
CapPrm: 0000010000000000
CapEff: 0000010000000000
CapBnd: 0000010000000000
CapAmb: 0000000000000000
# capsh --decode=0000010000000000
0x0000010000000000=cap_checkpoint_restore