나는 매우 민감한 네트워크 설정을 가지고 있으며 정말로 망쳐 놓고 싶지 않습니다. 내 네트워크는 sudo 권한을 가진 많은 사용자로 구성됩니다.
나는 그들이 실행을 중지하고 싶습니다
service NetworkManager restart
service network restart
명령.
내가 이것을 달성 할 수있는 방법이 있습니까?
나는 매우 민감한 네트워크 설정을 가지고 있으며 정말로 망쳐 놓고 싶지 않습니다. 내 네트워크는 sudo 권한을 가진 많은 사용자로 구성됩니다.
나는 그들이 실행을 중지하고 싶습니다
service NetworkManager restart
service network restart
명령.
내가 이것을 달성 할 수있는 방법이 있습니까?
답변:
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
.
불행히도 사용자가 여러 파일을 편집하도록 허용하는 것은 훨씬 어렵습니다 ...
와일드 카드에주의하십시오! 너무 많은 유연성 (또는 유연성)을 제공하면 다음과 같은 이점을 활용할 수 있습니다.
%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
공백을 포함하거나 도달하려고 시도하는 라인을 거부하면 /..
어떻게 될까요? 그런 다음 최종 실행 가능한 솔루션은 다음과 같습니다.
# 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
데이지 체인보다 더 안전하지 않을 수 있습니다.
글로브는 매우 제한적입니다-캐릭터 클래스를 여러 번 일치시킬 수 없습니다. 당신은 수있는 여러 파일 편집을 제공, 모든 파일 이름 (이 경우에 같은 길이가있는 경우 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를 참조하십시오! 한 번의 작은 슬립으로 인해 전체 수퍼 유저 계정과 전체 시스템이 손상 될 수 있습니다.
sudo
앞으로 정규 표현식 지원을 추가 할 수 있기를 바랍니다 . 올바르게 사용하면 많은 문제를 해결할 수 있습니다. 그러나 인수 속성 (파일, 폴더 또는 특정 플래그 만 허용)을 확인하는 기능도 필요할 수 있습니다.
그러나 sudo에서 유연성을 만드는 한 가지 대안이 있습니다. 벅을 통과 :
%staff ALL = /root/bin/staffedit *
그런 다음 staffedit
사용자가 전달한 인수가 올바른지 확인 하기 위해 자체 스크립트 또는 실행 파일을 작성하고 요청이있는 경우에만 수행하십시오.
ALL=(ALL:ALL) ALL
의미가 부족하다는 것을 알았지 만 항상 어딘가에 적절한 인수 검사기가있을 것이라고 생각했습니다 ... 나는 잘못되었습니다. 정말 매우 제한적입니다. 맨 페이지에서 제공하는 암호 루트 제외조차도 간단한 명령 줄 인수로 중단 될 수 있습니다 sudo passwd -q root
. sudo 저자는 그들의 웹 사이트에 [일부 대안] (sudo.ws/sudo/other.html)을 나열합니다. 앞으로 정규 표현식 지원을 추가 할 수 있기를 바랍니다.
rnano
'다른 이름으로 저장'기능이없는 나노 버전이므로 여기에 설명에 구체적으로 사용하십니까 ? 프로그램에 익숙하지 않습니다.
$ man nano
를 /-R<Enter>
-q
와야합니다 sudo passwd root -q
. 제외하면 pete 예제를 강화할 수 있습니다 *root*
.
sudoedit
파일 수정을 안전하게 활성화 하는 것을 고려하십시오 sudo
.
먼저으로 sudoers 파일을 엽니 다 sudo visudo
. user ALL=!/usr/sbin/service
will, IIRC를 추가 하면 service
user 명령이 허용되지 않습니다 user
.
출처 : http://nixcraft.com/showthread.php/15132-Sudo-Exclude-Commands-And-Disable-sudo-su-Bash-Shell
해결책을 찾았습니다.
터미널을 열고 루트 사용자로 변경 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
또한 명령.
sudo cp -p /etc/init.d/network /etc/init.d/network-not-in-sudo
다음과 sudo /etc/init.d/network-not-in-sudo restart
). 그렇기 때문에 sudoers 파일에 제외 대신 포함을 작성하는 것이 훨씬 더 안전한 이유입니다.
이것에 대한 진정한 대답은 이것을 막을 수 없다는 것입니다. 악의가없는 사람이 다른 답변에 설명 된 방법을 통해 실수로 해당 명령을 실행하는 것을 방지 할 수 있지만 누군가 실제로 명령을 실행하고 sudoers 목록에있는 경우 명령을 실행할 수 있습니다. 예를 들어 다음을 수행 할 수 있습니다.
joe@box:~$ sudo bash
root@box:~# service network restart
또는 sudoers 파일에서 제한을 우회하는 데 사용할 수있는 또 다른 재미있는 명령입니다.
sudo visudo
간단히 말해서, sudo 할 수 있고 특정 명령을 실행하는 데 제한되지 않으면 원하는 모든 것을 할 수 있습니다. 지정된 명령 세트로 제한하더라도 사용자가 실행 권한이있는 것과 동일한 이름으로 실행하려는 다른 명령을 복사 할 수 없도록해야합니다 ( 실행 권한이있는 명령을 덮어 쓰는 등)
firejail을 사용하여 샌드 박스가있는 사용자를 제한하십시오.
https://github.com/netblue30/firejail/
제한하려는 모든 사용자에 대해 / etc / passwd에서 bash 대신 firejail을 쉘로 설정하십시오. 사용하기 매우 쉽고 좋은 문서가 있습니다.
예:
user:x:1000:1000:user:/home/user:/usr/bin/firejail
networking
와network-manager
? 또한 왜 사용자가sudo
액세스 할 수 있습니까? 그들은 당신이 그들에게 완전한 루트 권한을 갖기를 원하지 않는다면 안됩니다.