sudoers에서 Cmnd_Alias와 함께 명령 인수를 어떻게 사용합니까?


36

sudoers에서 명령 인수를 어떻게 지정합니까? 배경으로, aws명령은 실제로 모든 하위 시스템에 대한 게이트웨이이며 사용자가 실행하도록 제한하고 싶습니다.aws s3 cp ...any other args...

내가 다음을 시도하면 /etc/sudoers

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp, /usr/local/aws/bin/aws s3 cp
gbt1 ALL=(gbt-ops) NOPASSWD: AWSS3_CMD

불행히도 쉘은 암호를 묻습니다

$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
gbt-ops's password:

Cmnd_Alias에서 args 명령을 제거하면 암호 프롬프트없이 원하는대로 흐르지 만 인증이 너무 광범위합니다. 따라서 특정 유형의 명령 호출로만 제한하는 올바른 방법은 무엇입니까 ?

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws, /usr/local/aws/bin/aws

그때

$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
...happy

고마워


왜 / usr / local / bin / aws, / usr / local / aws / bin / aws가 있습니까? 같은 줄에서 명령을 두 번 반복 했습니까?
Mohammed Noureldin

답변:


47

와일드 카드를 사용하지 않았지만 두 개의 인수를 제공했습니다. 따라서 sudo(경로 조회를 제외하고) 작성된 명령을 정확히 찾습니다 (from man 5 sudoers) :

 If a Cmnd has associated command line arguments, then the arguments in
 the Cmnd must match exactly those given by the user on the command line
 (or match the wildcards if there are any).

다음과 같은 것을 시도하십시오 :

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp *, /usr/local/aws/bin/aws s3 cp *

참고 :

 Wildcards in command line arguments should be used with care.  Because
 command line arguments are matched as a single, concatenated string, a
 wildcard such as ‘?’ or ‘*’ can match multiple words. 

따라서 명령 당 하나의 와일드 카드 만 필요합니다.


1
간결한 설명과 지식 공유를 위해 +1 해 주셔서 감사합니다.
Dinesh

1
sudo는 경우에 따라 익스플로잇에 사용할 수있는 인수 분리를 제대로 존중하지 않습니다 . unix.stackexchange.com/a/279142/43920을 참조하십시오 . 따라서 /usr/local/bin/aws s3 cpsudoers 를 지정하는 대신 스크립트로 바꾸는 것이 더 안전합니다 (루트 만 쓸 수 있음).
pcworld December

6

@muru와 동일하지만 전체 예제를 좋아하는 사람들을 위해 :

# Cmnd alias specification
Cmnd_Alias ECHO_CMD=/bin/echo A *,/bin/echo B *

# Make USER run specific commands on given HOSTNAME
# USER_NAME 

#userx
userx ALL=(root) NOPASSWD: /sbin/cmd1,/sbin/cmd2,ECHO_CMD

반면 /sbin/cmd1, /sbin/cmd2다른 명령을 할 수있다.

그 목적은 암호 문구를 요구 하지는 않지만, 간단한 실험을 통해 자신감을 가질 수 ECHO_CMD있도록 제시하는 sudo echo X Asudo echo A X입니다.

(시스템에서 에코가 /bin/echo어디에 있는지 확인하기 위해 echo가 앉아 있다고 가정했습니다 whereis echo)


예, /bin/echo바이너리가 있지만 대부분의 쉘에는 echo전체 경로를 제공하지 않으면이 바이너리 대신 사용되는 내장 기능 이 있습니다.
Marki555
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.