나는 사용자 그룹이 dhcpcd 서비스 인스턴스에 대한 일부 제어권을 갖도록 허용하려고 합니다. 즉, 나는 그들이 다음을 실행하길 원합니다:
systemctl (start,stop,...) [email protected]
비밀번호를 묻는 메시지를 표시하지 않지만 다음과 같은 경우에만[이메일 보호됨]. 이를 수행하는 방법을 찾았지만 각 하위 명령을 해당 줄에 나열해야 합니다.
%mygroup ALL=NOPASSWD: /usr/bin/systemctl start [email protected], /usr/bin/systemctl stop [email protected], ...
더 우아한 방법이 있나요?
답변1
Sudoers 와일드카드는 와일드카드 문자( man glob
, man fnmatch
)만 지원합니다. 단, start
, stop
, restart
등의 명령은 systemctl
파일이 아니므로 와일드카드를 사용할 수 없습니다.
보안 관점에서 모든 명령을 열거해야 하는 것은 좋은 일입니다. 시스템 업데이트 [email protected]
등의 명령을 사용하여 업데이트하는 경우 shutdown-machine
sudo 사용자는 이를 사용할 수 없습니다(다행히도).
sudoers 매뉴얼에는 이에 대한 메모가 있습니다.
Wildcards in command line arguments should be used with care.
Command line arguments are matched as a single, concatenated string. This mean a wildcard character such as ‘?’ or
‘*’ will match across word boundaries, which may be unexpected. For example, while a sudoers entry like:
%operator ALL = /bin/cat /var/log/messages*
will allow command like:
$ sudo cat /var/log/messages.1
It will also allow:
$ sudo cat /var/log/messages /etc/shadow
which is probably not what was intended. In most cases it is better to do command line processing outside of the
sudoers file in a scripting language.
반면에 입력 시간을 절약하려면 설명서에서 권장하는 대로 정확하게 수행할 수 있습니다. 바로 스크립트 언어를 사용하는 것입니다. 예를 들어 다음과 같이 작성할 수 있습니다 /usr/local/sbin/sudoers-dhcpd.sh
.
#!/bin/sh
case "$1" in
start)
systemctl start [email protected]
;;
stop)
systemctl stop [email protected]
;;
restart)
systemctl restart [email protected]
;;
*)
echo You are not allowed to do that!
;;
esac
다음과 같이 sudoers 줄을 추가합니다.
%mygroup ALL=NOPASSWD: /usr/local/sbin/sudoers-dhcpd.sh