편집 1

편집 1

저는 Debian 12를 사용하고 있으며 특정 inode(/proc/net/raw 및 /proc/net/packet)가 있는 프로세스를 식별하는 스크립트를 작성하려고 합니다.

내 원래 grep 명령은 다음과 같습니다(PID 자체를 가져옵니다).

inode=$(cat /proc/net/packet | sed -r 's/\s+/,/g' | cut -d"," -f9 | sed '1d')
sudo ls -l /proc/*/fd/* 2>/dev/null | grep -oP "(?<=proc\/)[0-9]+(?=\/fd.*\[$inode\])"

아래와 같이 더 간단한 예를 사용했습니다.

스크립트를 실행할 사용자는 루트가 아니지만 /proc에서 루트에 액세스할 수 있는 파일만 읽을 수 있어야 합니다. 이를 위해 나는 sudoers에서 nopasswd 라인을 사용하여 ls 명령을 특정 /proc 디렉토리에 구체적으로 배치하기로 선택했습니다(전체 스크립트에 sudo를 사용하는 대신).

user ALL=(ALL) NOPASSWD: /usr/bin/ls -l /proc/*/fd/*

Sudo를 사용하면 비밀번호 없이 명령이 예상대로 실행될 수 있지만 누락된 파일은 액세스 오류로 표시되지도 않습니다. grep 없이 원시 목록을 수행하면 sudo가 소유한 파일만 표시되므로 sudo 명령이 작동하지 않는 것 같습니다.user

사용자의 Sudo

user@localhost:~/# sudo /usr/bin/ls -l /proc/*/fd/* | grep "946"
lr-x------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/17 -> pipe:[89462]
l-wx------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/18 -> pipe:[89462]
lr-x------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/19 -> pipe:[89463]
l-wx------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/20 -> pipe:[89463]
lr-x------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/44 -> pipe:[89464]
l-wx------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/45 -> pipe:[89464]
lrwx------ 1 user user 64 Jun 30 12:14 /proc/1424/fd/12 -> socket:[24946]
lr-x------ 1 user user 64 Jun 30 07:53 /proc/2958/fd/44 -> pipe:[32946]
l-wx------ 1 user user 64 Jun 30 07:53 /proc/2958/fd/45 -> pipe:[32946]

수 루겐

root@localhost:~/# sudo /usr/bin/ls -l /proc/*/fd/* | grep "946"
lr-x------ 1 user     user     64 Jun 30 11:39 /proc/10251/fd/17 -> pipe:[89462]
l-wx------ 1 user     user     64 Jun 30 11:39 /proc/10251/fd/18 -> pipe:[89462]
lr-x------ 1 user     user     64 Jun 30 11:39 /proc/10251/fd/19 -> pipe:[89463]
l-wx------ 1 user     user     64 Jun 30 11:39 /proc/10251/fd/20 -> pipe:[89463]
lr-x------ 1 user     user     64 Jun 30 11:39 /proc/10251/fd/44 -> pipe:[89464]
l-wx------ 1 user     user     64 Jun 30 11:39 /proc/10251/fd/45 -> pipe:[89464]
lrwx------ 1 root     root     64 Jun 30 12:14 /proc/1191/fd/22 -> socket:[946]
lrwx------ 1 user     user     64 Jun 30 12:14 /proc/1424/fd/12 -> socket:[24946]
lr-x------ 1 user     user     64 Jun 30 07:53 /proc/2958/fd/44 -> pipe:[32946]
l-wx------ 1 user     user     64 Jun 30 07:53 /proc/2958/fd/45 -> pipe:[32946]

Sudo는 PID 1191(NetworkManager)의 루트가 소유한 fd 디렉토리를 볼 수 없습니다. 하지만 루트로 su하면 볼 수 있습니다. 나는 심지어 다음과 같이 sudoers 줄을 만들어 보았습니다.

user ALL=(ALL) NOPASSWD: /usr/bin/ls*

비밀번호를 입력하지 않고도 명령을 실행할 수 있지만 반환되는 데이터는 동일합니다. 루트 소유 파일은 없습니다.

왜 이런 일이 발생합니까? sudo가 실제로 루트인줄 알았는데?

사용자에게 /proc/를 통해 grep할 수 있는 최소한의 권한을 부여하려면 어떻게 해야 합니까?/fd/인덱스 노드의 경우?

답변1

문제는 쉘 글로빙이 sudo시작 전에, 즉 일반 사용자 권한으로 발생한다는 것입니다.

당신은 다음과 같은 것이 필요합니다

sudo bash -c 'ls -l /proc/*/fd/*'

편집 1

sudoers은 다음과 같습니다.

user ALL=(ALL) NOPASSWD: /usr/bin/bash -c ls -l /proc/\*/fd/\*

관련 정보