루트로 실행되는 프로세스에는 항상 Linux에서 사용할 수 있는 모든 기능이 있습니까?

루트로 실행되는 프로세스에는 항상 Linux에서 사용할 수 있는 모든 기능이 있습니까?

Linux에서는 루트가 아닌 사용자가 실행하는 프로세스에 권한을 높이는 기능을 할당할 수 있습니다.

루트 사용자가 실행하는 프로세스에는 사용 가능한 모든 기능이 있지만 경우에 따라 이러한 프로세스에서 일부 기능이 수동 또는 자동으로 제거될 수 있습니까?

답변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이 플래그와 함께 사용할 수 있습니다.

이러한 방식으로 네트워크 공유를 마운트할 수 있지만 클라이언트의 루트 사용자는 서버에서 호스팅되는 파일에 대한 루트 액세스 권한을 얻지 못하므로 NFS를 사용할 수 있습니다. 이 경우 다른 호스트에서 파일에 액세스할 수 있도록 할 수 있으며 해당 호스트의 사용자가 해당 컴퓨터에 대한 루트 권한을 갖고 있더라도 콘텐츠는 여전히 안전합니다.

이는 기업 환경에서 유용합니다. 예를 들어 네트워크 관리자가 자신의 장치 로그에 액세스할 수 있도록 허용하지만 변경할 수는 없도록 하려는 경우입니다. Linux 관리 상자에 대한 루트 액세스 권한이 있어도 로그를 변경할 수 없습니다.

더 자세히 읽고 싶다면 제가 가장 좋아하는 가이드를 참조하세요.http://fullautolinux.blogspot.com/2015/11/nfs-norootsquash-and-suid-basic-nfs.html

SSH

당신이 할 수 있는 몇 가지 다른 일이 있습니다. 예를 들어 루트가 SSH를 통해 디바이스에 연결하는 것을 방지할 수 있습니다. 즉, 루트가 되려면 사용자가 다른 계정(예: 생성한 관리자 계정)을 사용하여 장치에 액세스한 다음 유사한 명령을 사용하여 루트로 전환해야 합니다 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)을 사용하는 것이 좋습니다. 다음 규칙은 스레드 기능 세트의 변경 사항을 관리합니다.

...

  1. 새 권한 집합은 기존 권한 집합의 하위 집합이어야 합니다(즉, 스레드가 현재 가지고 있지 않은 권한 기능을 얻는 것은 불가능합니다).
  2. 새로운 유효한 집합은 새로운 허용 집합의 하위 집합이어야 합니다.

--능력(7)

답변4

@ilkkachu 답변에 정보를 추가하고 있습니다.
프로세스의 기능에 따라 사용자에게 권한이 있는지 여부가 결정되는 것 같습니다.

cap_checkpoint_restore예를 들어 하나의 기능( )만 제외하고 모두 제거합니다 .

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사용자가 다음과 같은 경우에도 하나의 능력만 가지고 있음을 알 수 있습니다 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

관련 정보