공백이 포함 된 인수를 사용하여 명령을 실행할 수 있도록 허용


17

한 명의 사용자가 grep (sudo를 통해)를 실행하고 하나의 특정 파일에서 하나의 특정 문자열을 grep하도록 허용하고 싶습니다. 이 사용자가 모든 파일에서 grep을 실행할 수있게하고 싶지 않습니다. 사용자는 파일에 대한 읽기 권한이 없으므로 sudo를 사용해야합니다. 컴퓨터에서 다른 서비스의 로그 파일을 greps하는 nagios check를 작성하려고합니다.

그러나 작동하지 않으면 sudo는 계속 암호를 요구합니다.

내 명령은 : sudo grep "string I want (" /var/log/thefilename.log(예, (grep하려는 문자열에 원시 공간과 약간의 공백이 있습니다)

/etc/sudoers.d/user-can-grep 이 내용이 있습니다 :

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

이 sudoers 파일은 소유 root:root하고 있으며 권한이 있습니다-r--r-----

서버는 Ubuntu trusty 14.04.3 LTS입니다.

이 작업을 어떻게 수행 할 수 있습니까?


nagios가 명시 적으로 / bin / grep 또는 / usr / bin / grep를 호출합니까?
Jeff Schaller

이 작업을 수행하는 셸 스크립트를 작성한 다음 스크립트를 실행하십시오 sudo.
user253751

@JeffSchaller 참고 스크립트는 호출 grep하고, which grep그것을 사용하고 나에게 말한다 /bin/grep. sudo 파일의 AFAIK에서는 전체 경로없이 호출하더라도 바이너리의 전체 경로를 지정해야합니다.
Rory

답변:


13

분명히 sudo는 명령을 sudoers 파일의 사양과 비교하기 전에 문자열로 병합합니다. 따라서 귀하의 경우 따옴표 또는 다른 형식의 이스케이프를 사용할 필요가 없습니다.

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

편집 : @ user23013은 주석에서 지적했듯이 모든 파일에서 "원하는 문자열"에 대해 grep하여 확장 할 수 있습니다 (확장자에 따라 "문자열 I"및 "문자열"도 사용). sudo의 인수 검사를 사용하십시오!


또한 다음 호출은 동일합니다. 즉, 사용자를 하나의 특정 표현으로 제한 할 수 없습니다.

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

이것은 따옴표와 이스케이프가 쉘에 의해 처리되고 결코 도달하지 않기 때문 sudo입니다.


흥미롭게도, 그것이 악용 가능한지 궁금합니다. 즉 sudo, 사양과 일치하는 것을 입력했는지 확인하지만 그것을 실행할 때 완전히 다른 것입니다.
EightBitTony

4
@EightBitTony 물론입니다! 당신의 sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file( "사용자가 편집 sudoers 파일"을 편집 할 수 있도록)에 cd들어가서 /etc/실행 하면 악용 될 수 있습니다 sudo vim Editing sudoers file. 나는 합리적인 복잡성의 어떤 명령에 대해서도 여러분의 의견에 제안 된 접근 방식을 따라야한다고 주장합니다. 쉘은 $@인수가 그룹화 될 것으로 예상되는 방식으로 그룹화되었는지 확인할 수있는 변수를 제공 합니다.
Alexander Batischev

8
( /var/log어디에서나 경로를 만들고 thefilename.log모든 파일에 심볼릭 링크 를하면 사용자는 string I want모든 파일에서 grep 할 수 있습니다 .
user23013

2
@EightBitTony의 답변 (래퍼 스크립트 작성, 해당 스크립트에 대한 sudo 액세스 허용)이 훨씬 좋고 안전합니다.
cas

와우, 그것은 보안 중심 도구에 대한 매우 나쁜 연습입니다.
Sam Watkins

32
  1. 스크립트 작성 (루트 만 쓸 수 있음)
  2. 그 스크립트에서 grep필요한 것을 실행하십시오.
  3. sudoers 구성에서 해당 스크립트에 대한 액세스 만 허용
  4. 도구를 구성하거나 sudo를 통해 스크립트를 실행하도록 사용자에게 조언하십시오.

디버깅하기가 훨씬 쉽고 특정 파일에 대한 특정 액세스를 잠그기가 쉬우 며 악용하기가 훨씬 어렵습니다.


2

파일 액세스에는 루트 만 필요하므로 cat, tee또는 이와 유사한 것을 사용 grep하고 실행해야하는 모든 프로그램에 파이프를 연결하십시오 . 예를 들어이 sudo cat /file/path | grep …방법을 사용하면 루트를 필요한 곳으로 제한 할 수 있습니다.


0

sudo훌륭하지만 때로는 가장 적합하지 않습니다. 이를 위해 나는 사용하고 싶다 super. super또한 권한 상승을 허용하지만 명령 별명을 가정하므로 간단한 명령 행으로 사용되므로 복잡한 명령 행을 허용 할 때 편리합니다.

super.tab은 다음과 같습니다.

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

로 호출됩니다 super grepcmd.


sudohas Cmnd_Alias(arg 제한이 있거나없는 하나 이상의 명령을 포함 할 수 있음).
cas

전혀 같은 것이 아닙니다. Cmnd_Alias는 구성 파일을 단순화하는 도구입니다. 슈퍼의 기본 작업 모드 인 사용자에게 별칭을 노출시키지 않습니다. (별칭 명령이나 suid 스크립트를 실행하지 않을 때 sudo를 사용하는 이유는 (대부분)) 이 두 가지 사용 사례에 대해서는 super입니다.
hildred

그 래퍼 스크립트의 목적은 ... 한 줄짜리에만 국한되거나 성가신 인용 문제가 없습니다.
cas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.