sudo 사용자가 특정 명령을 실행하지 못하게하는 방법은 무엇입니까?


29

나는 매우 민감한 네트워크 설정을 가지고 있으며 정말로 망쳐 놓고 싶지 않습니다. 내 네트워크는 sudo 권한을 가진 많은 사용자로 구성됩니다.

나는 그들이 실행을 중지하고 싶습니다

service NetworkManager restart
service network restart

명령.

내가 이것을 달성 할 수있는 방법이 있습니까?


어떤 배포판을 사용하고 있습니까? 서비스 이름은 배포판마다 다르며 해당 이름을 사용하는 배포판을 모릅니다. 당신은 의미합니까 networkingnetwork-manager? 또한 왜 사용자가 sudo액세스 할 수 있습니까? 그들은 당신이 그들에게 완전한 루트 권한을 갖기를 원하지 않는다면 안됩니다.
terdon

@terdon 나는 그것을 해결했다. 고맙습니다. 내가 새로운 사용자이기 때문에 답변으로 게시 할 수 없습니다
shekhar

예, 할 수 있습니다. 또한 당신이 찾은 대답을 알고 싶습니다.
terdon

@terdon 확실하지만 그 말은 내가 10 명성을 가지고 있지 않기 때문에 8 시간 내 자신의 답변을 게시해야 기다릴 필요가있다
shekhar

1
아, 예, 죄송합니다. 기다려야합니다. 방금
공언

답변:


47

CmndAlias ALL를 사용하면 안전하지 않습니다

service network restart하지 않고 실행 하는 방법은 1000 가지가 있습니다 sudo service network restart. 나쁜 사용자가 시도 할 수있는 예는 다음과 같습니다.

$ echo "service network restart" > /tmp/hax
$ chmod a+x /tmp/hax
$ sudo /tmp/hax

사용자에게 ALL명령 별칭 을 제공 한 다음 블랙리스트를 만들려고하면 항상 그 주위의 방법을 찾을 수 있습니다. 블랙리스트 bash는 파이썬을 사용합니다. 파이썬을 블랙리스트에 올리면 Perl을 사용합니다. 블랙리스트 펄, 그리고 그들은 PHP를 사용합니다. 아무도 그것을 원하지 않습니다!

누군가가 무언가를하기를 정말로 원하지 않는다면, Thomas가 말한대로하고, 그들이 수 있는 것들의 화이트리스트를 만들어야합니다 .


예외와 함께 화이트리스트 설정

제외가있는 작은 화이트리스트의 예는 아래에서 찾을 수 있습니다 man sudoers.

 pete           HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

The user pete is allowed to change anyone's password except for root on the HPPA
machines.  Note that this assumes passwd(1) does not take multiple user names
on the command line.

(실제 맨 페이지의이 예제는 안전하지 않으며 루트 암호를 변경하기 위해 악용 될 수 있습니다! 방법에 대해서는 아래 주석을 참조하십시오.)

우리는 service직원 그룹에 모든 명령을 제공하기 위해 귀하의 경우에 맞게 노력할 수 있지만 귀하와 관련된 명령은 제외 합니다 service network.

%staff ALL =   /usr/sbin/service *,                            \
             ! /usr/sbin/service *network*,                    \
             ! /usr/sbin/service *NetworkManager*

( ALL그 위치의 Cmnd_Alias가 아닌 Host_Alias를 나타냅니다. 혼란스럽지 않습니까?)

사용자는 실행할 수 없습니다 sudo bash또는 sudo tee또는 sudo wget또는 sudo /path/to/malicious_script. 조심하면 사용자에 대한 추가 관리 명령을 허용 목록에 추가 할 수 있습니다. 구체적으로 말하십시오!

참고 : 나중에 무해한 플래그가 도구에 추가 될 경우를 대비하여 위 *의 단어 앞에를 network추가했습니다 service. --verbose나중에 플래그가 추가되었다고 가정 하면 사용자는 다음을 실행할 수 있습니다.

$ sudo service --verbose network restart

따라서 *서비스 이름 앞에 플래그를 사용해야합니다 . 한 가지 단점은 실제로 실행중인 사용자를 신경 쓰지 않는 다른 서비스 (예 : 서비스 safe-network또는 network-monitor거부 된 서비스)를 차단할 수 있다는 것입니다.


사용자가 그룹 권한을 사용하여 파일을 편집하도록 허용

당신이 사용하는 다양한 시도를 찾을 수 아래 rnano통해 sudo사용자 편집 파일이나 파일을 수 있도록. 그러나 실제로는 실제보다 더 복잡하고 위험합니다.

훨씬 간단하고 안전한 솔루션은 편집 권한을 열려고하는 특정 파일에 대한 그룹 권한을 변경하는 것입니다. 다음은 몇 가지 예입니다.

### Give steve the ability to edit his nginx config:
$ chgrp steve /etc/nginx/sites-available/steves_dodgy_project
$ chmod g+rw /etc/nginx/sites-available/steves_dodgy_project

### Let all members of the staff group edit the group_website config:
$ chgrp staff /etc/nginx/sites-available/group_website
$ chmod g+rw /etc/nginx/sites-available/group_website

보다 세분화 된 제어가 필요한 경우 (예 : 모든 직원이 아닌 3 명의 사용자 만 액세스) addgroup명령을 사용하여 새 그룹을 작성 하고 몇 명의 사용자 만 추가 할 수 있습니다.


사용자가 파일을 통해 편집 할 수 있도록 허용 sudo

이 답변의 나머지 부분은 sudo사용자에게 유연성을 제공하려고 할 때 구성에 구멍을 뚫는 것이 얼마나 쉬운 지에 대한 조사가되었습니다 . 다음 중 하나를 수행하지 않는 것이 좋습니다!

사용자에게 특정 파일을 편집 할 수있는 권한을 부여하려면 다음을 사용하십시오 rnano.

%staff ALL = /bin/rnano /etc/nginx/sites-available/host

rnano지정된 파일 만 편집 할 수 있습니다. 악의적 인 사용자가 다른 업 스타트 서비스 (예를 들어 /etc/init.d/urandom) 를 편집하고 이를 실행할 라인을 추가 하지 못하게하는 것이 중요 합니다 service network restart.

불행히도 rvim충분히 제한 할 수있는 방법을 찾지 못했습니다 (사용자는 여전히을 사용하여 파일을 열 수 있음 :e) nano.

불행히도 사용자가 여러 파일을 편집하도록 허용하는 것은 훨씬 어렵습니다 ...


사용자가 여러 파일을 편집하도록 허용

1. 안전하지 않은 접근법

와일드 카드에주의하십시오! 너무 많은 유연성 (또는 유연성)을 제공하면 다음과 같은 이점을 활용할 수 있습니다.

%staff ALL = /bin/rnano /etc/nginx/sites-available/*                # UNSAFE!

이 경우 악의적 인 사용자가 다른 시작 서비스 스크립트를 편집 한 다음 실행할 수 있습니다.

$ sudo rnano /etc/nginx/sites-available/../../../any/file/on/the/system

(Sudo는 실제로 명령을 방지 .하고 ..확장하지만 불행히도 인수는 아닙니다.)

나는 이런 식으로 작동하기를 바랐지만 여전히 안전하지 않습니다.

%staff ALL = /bin/rnano /etc/nginx/sites-available/[A-Za-z0-9_-]*   # UNSAFE!

sudo현재는 glob 패턴 만 제공 하므로 어떤 것과 *도 일치 합니다. 정규 표현식이 아닙니다!

(편집 : 아래에 하위 폴더가 없으므로 위의 상황에서 벗어날 있다고 생각했습니다 sites-available. 폴더 뒤에 하나의 문자가 일치하도록 요구 /..했으며 파일 이름 뒤에 실패해야합니다. rnano여러 인수를 허용 하기 때문에 실행 가능한 솔루션이며 일반적으로 하위 폴더가있는 폴더에서는 여전히 안전하지 않습니다 !)

하위 폴더가없고을 포함하는 행을 제외하더라도 glob를 /../제공하는 규칙 은 여러 인수를 허용하고 (글로벌 순환) 공간이 행복하게 받아 들여 *지기 때문에 여전히 악용 될 수 있습니다 .rnano<C-X>*

$ rnano /etc/nginx/sites-available/legal_file /then/any/file/on/the/system

2. 봉투를 밀면 (최종 안전하지 않음)

공백을 포함하거나 도달하려고 시도하는 라인을 거부하면 /..어떻게 될까요? 그런 다음 최종 실행 가능한 솔루션은 다음과 같습니다.

# I tried hard to make this safe, but in the end I failed again.
# Please don't use this unless you are really smart or really stupid.

%staff ALL =   /bin/rnano /etc/nginx/sites-available/*,    \
             ! /bin/rnano */..*,                           \
             ! /bin/rnano /etc/nginx/sites-available/,     \
             ! /bin/rnano */.,                             \
             ! /bin/rnano * *

# CONCLUSION: It is still NOT SAFE if there are any subfolders, due to
# the bug in rnano described below.

우리는 폴더 "에서"아무것도 동의하지만, 우리는 또한 모든 통화를 거부 rnano하는 경우 /../.또는 전달하거나 폴더를 직접 대상으로합니다. (기술적으로 /.제외는 /..제외를 중복으로 만들지 만 명확성을 위해 둘 다 남겨 두었습니다.)

폴더를 찾았습니다. /.그렇지 않으면 사용자가 폴더 자체를 타겟팅 할 수 있기 때문에 제외가 필요했습니다. 이제 rnano폴더를 가리키면 차단 한다고 생각할 수도 있지만 잘못되었을 것입니다. 실제로 내 버전 (2.2.6-1ubuntu1)은 가벼운 경고와 빈 파일로 시작한 다음 저장하려는 파일 이름<C-X> 을 입력 하라는 메시지가 표시되어 새로운 공격 경로를 엽니 다! 적어도 기존 파일을 덮어 쓰지 않았습니다 (내가 한 테스트에서). 어쨌든 sudo를 사용하여 하위 폴더를 블랙리스트에 올리는 방법이 없으므로이 접근 방식이 다시 안전하지 않다는 결론을 내려야합니다. 죄송합니다.

이 발견은 nano'제한된'모드의 철저 함을 의심하게 만들었다 . 그들은 체인이 가장 약한 링크만큼 강력하다고 말합니다. 나는 sudo블랙리스트 블랙 매직 의 조합을 느끼기 시작했고 rnano데이지 체인보다 더 안전하지 않을 수 있습니다.

3. 안전하지만 제한된 접근

글로브는 매우 제한적입니다-캐릭터 클래스를 여러 번 일치시킬 수 없습니다. 당신은 수있는 여러 파일 편집을 제공, 모든 파일 이름 (이 경우에 같은 길이가있는 경우 host하나의 숫자 다음에) :

%staff ALL = /bin/rnano /etc/nginx/sites-available/host[0-9]       # SAFE

그러나 사용자에게 다양한 파일을 편집 할 수있는 액세스 권한을 부여하려면 각 파일을 명시 적으로 지정해야합니다.

%staff ALL = /bin/rnano /etc/nginx/sites-available/hothost    \
             /bin/rnano /etc/nginx/sites-available/coldhost   \    # SAFE
             /bin/rnano /etc/nginx/sites-available/wethost    \
             /bin/rnano /etc/nginx/sites-available/steves_dodgy_project

*아무 때나사용 하려고 유혹하지 마십시오 . 이유는 위의 섹션 1과 2를 참조하십시오! 한 번의 작은 슬립으로 인해 전체 수퍼 유저 계정과 전체 시스템이 손상 될 수 있습니다.

4. 자신의 인수 검사기를 작성하십시오 (안전은 이제 귀하의 책임입니다).

sudo앞으로 정규 표현식 지원을 추가 할 수 있기를 바랍니다 . 올바르게 사용하면 많은 문제를 해결할 수 있습니다. 그러나 인수 속성 (파일, 폴더 또는 특정 플래그 만 허용)을 확인하는 기능도 필요할 수 있습니다.

그러나 sudo에서 유연성을 만드는 한 가지 대안이 있습니다. 벅을 통과 :

%staff ALL = /root/bin/staffedit *

그런 다음 staffedit사용자가 전달한 인수가 올바른지 확인 하기 위해 자체 스크립트 또는 실행 파일을 작성하고 요청이있는 경우에만 수행하십시오.


5
이 답변은 오랜 시간이 걸렸지 만 마침내 sudo가 어떻게 작동하는지 이해합니다. 나는 과거에 여러 가지 경우를 포기하고 ALL=(ALL:ALL) ALL의미가 부족하다는 것을 알았지 만 항상 어딘가에 적절한 인수 검사기가있을 것이라고 생각했습니다 ... 나는 잘못되었습니다. 정말 매우 제한적입니다. 맨 페이지에서 제공하는 암호 루트 제외조차도 간단한 명령 줄 인수로 중단 될 수 있습니다 sudo passwd -q root. sudo 저자는 그들의 웹 사이트에 [일부 대안] (sudo.ws/sudo/other.html)을 나열합니다. 앞으로 정규 표현식 지원을 추가 할 수 있기를 바랍니다.
joeytwiddle

rnano'다른 이름으로 저장'기능이없는 나노 버전이므로 여기에 설명에 구체적으로 사용하십니까 ? 프로그램에 익숙하지 않습니다.
Shadur

예. 보안에 관심이 있다면 편집기는 지정된 파일 하나만 편집해야하며 쉘을 열 수 없어야합니다. 정보 $ man nano/-R<Enter>
얻으려면

수정 : pete 예제를 깨 뜨리려면 다음에 -q와야합니다 sudo passwd root -q. 제외하면 pete 예제를 강화할 수 있습니다 *root*.
joeytwiddle

으로 sudoedit파일 수정을 안전하게 활성화 하는 것을 고려하십시오 sudo.
Totor

5

먼저으로 sudoers 파일을 엽니 다 sudo visudo. user ALL=!/usr/sbin/servicewill, IIRC를 추가 하면 serviceuser 명령이 허용되지 않습니다 user.

출처 : http://nixcraft.com/showthread.php/15132-Sudo-Exclude-Commands-And-Disable-sudo-su-Bash-Shell


이것은 다른 서비스도 실행을 중단하고 원하지 않습니다. 답변 해주셔서 감사합니다. :)
shekhar

귀하의 답변이 정확히 도움이되지는 않았지만 해결책을 찾아내는 데 도움이되었습니다. 그러나 당신은 당신에게 공감하거나 내 대답을 게시하는 것으로 알고 있습니다. 내가 한 번 감사합니다. 고맙습니다.
shekhar

2
그래도 그래도 다른 사람들이 말했듯이 조심해야합니다. 액세스하는 방법에는 여러 가지가 있습니다. 쉘 등을 생성 할 수있는 모든 명령 모든 "금지 된"명령을 제외하려고하는 대신 실제로 필요한 명령을 파악하고 허용하는 것이 더 쉽습니다.
Bonsi Scott

3
많은 시나리오에서 화이트리스트를 유지 관리 할 수 ​​없습니다. 진정한 목표는 그들이 무언가 를 하지 못하도록 하는 것이 아니라 오히려 그들이 실수로 나쁜 것을 저 지르지 못하게하는 것입니다. 이 경우 블랙리스트가 좋습니다. 합리적인 사용자가 작업을 수행하는 방법을 차단합니다. 그러나 sudo를 통한 블랙리스트를 작성하는 것만으로는 충분하지 않을 수 있습니다. 한 가지 방법은 'service'명령을 래핑하는 것이며, 사용하지 않으려는 경우 알려주십시오. 그러나 화이트리스트에는 모든 좋은 행동을, 블랙리스트에는 나쁜 행동을 모두 나열하지 않습니다.
Bob Kerns 2014 년

1
밥 동의합니다. 전체 액세스를 허용하지 않고 유연성을 유지하려면 자체 스크립트를 도우미 스크립트로 롤업하고 해당 스크립트 만 화이트리스트에 추가해야합니다. sudo 화이트리스트는 필요한 작업을 수행 할 수 있지만 종종 너무 제한되거나 악용되기 쉽습니다.
joeytwiddle

5

해결책을 찾았습니다.

터미널을 열고 루트 사용자로 변경 su -한 다음 visudo편집하도록 입력 했습니다.

마지막에 나는 같은 줄을 썼다.

user ALL=!/etc/init.d/NetworkManager restart
user ALL=!/etc/init.d/network restart

그런 다음 저장하고 닫았다가 다시 시작했습니다.

이제 내가 입력 service network restart하거나 입력 service NetworkManager restart하지 않으면 다음과 같은 오류가 발생합니다.

Sorry user is not allowed to execute '/sbin/service NetowkrManager restart' as root on localhost.localdomain

유사위한 service network restart또한 명령.


12
즉 미경과 unmalicious 사용자를 위해 작동하지만 우회하기 sudo를 제한 (예 용이 sudo cp -p /etc/init.d/network /etc/init.d/network-not-in-sudo다음과 sudo /etc/init.d/network-not-in-sudo restart). 그렇기 때문에 sudoers 파일에 제외 대신 포함을 작성하는 것이 훨씬 더 안전한 이유입니다.
Thomas

'서비스 네트워크 다시 시작'이 수행하는 모든 작업은 네트워크 init.d 스크립트의 명령과 같은 다른 명령으로 수행 할 수 있습니다. 나는 그것들을 여기에 나열조차하지 않을 것입니다. 그러나 예를 들어 인터페이스 상태의 수정을 실제로 방지하려는 경우 SELinux 정책이 나에게 갈 길입니다. 복잡한 주제이지만 화이트리스트가 너무 제한적이거나 부담스럽고 ​​블랙리스트가 부적절 할 경우 아마도 최선의 선택 일 것입니다. 커널에서 구현되며 sudo'd 사용자에게만 네트워크 인터페이스 (및 기타 리소스)에 대한 액세스를 제한 할 수 있습니다.
Bob Kerns

SELinux로 가능하다면 더 기쁠 것입니다. @BobKerns 감사합니다. 그런 식으로 시도합니다.
shekhar

3

이것에 대한 진정한 대답은 이것을 막을 수 없다는 것입니다. 악의가없는 사람이 다른 답변에 설명 된 방법을 통해 실수로 해당 명령을 실행하는 것을 방지 할 수 있지만 누군가 실제로 명령을 실행하고 sudoers 목록에있는 경우 명령을 실행할 수 있습니다. 예를 들어 다음을 수행 할 수 있습니다.

joe@box:~$ sudo bash root@box:~# service network restart

또는 sudoers 파일에서 제한을 우회하는 데 사용할 수있는 또 다른 재미있는 명령입니다.

sudo visudo

간단히 말해서, sudo 할 수 있고 특정 명령을 실행하는 데 제한되지 않으면 원하는 모든 것을 할 수 있습니다. 지정된 명령 세트로 제한하더라도 사용자가 실행 권한이있는 것과 동일한 이름으로 실행하려는 다른 명령을 복사 할 수 없도록해야합니다 ( 실행 권한이있는 명령을 덮어 쓰는 등)


네. 내부에서 쉘을 생성 할 수있는 명령을 피해야합니다.
Bonsi Scott

1
문제는 보호하려는 명령이 아니라 라우팅 테이블, 인터페이스 등과 같은 커널 객체의 상태입니다. 어떤 명령 (또는 시스템 호출)을 사용하든 상관 없습니다. 그리고 모든 루트 사용자가 아닌 일부 루트 사용자로부터 보호하려고합니다. SELinux는 이러한 종류의 시나리오를 중심으로 설계되었습니다. 그러나 먼저이 모든 사용자가 sudo 액세스 권한을 갖는 이유에 대한 검토부터 시작하겠습니다. 그들이 몇 가지 특정 일을 해야하는 경우 sudoers의 허용 목록 작업 만 있으면됩니다.
Bob Kerns

2

firejail을 사용하여 샌드 박스가있는 사용자를 제한하십시오.

https://github.com/netblue30/firejail/

제한하려는 모든 사용자에 대해 / etc / passwd에서 bash 대신 firejail을 쉘로 설정하십시오. 사용하기 매우 쉽고 좋은 문서가 있습니다.

예:

user:x:1000:1000:user:/home/user:/usr/bin/firejail
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.