명령줄의 다음 줄은 내 사용 사례를 설명합니다.
명령줄 매개변수의 와일드카드 문자는 주의해서 사용해야 합니다. 명령줄 인수는 단일 연결 문자열로 일치하므로 와일드카드 문자(예: "?") 또는 '*'는 여러 단어와 일치할 수 있습니다. 예를 들어, sudoers 항목이 다음과 같은 경우:
%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
이것은 우리가 원하는 것이 아닐 수도 있습니다.
운영자가 로 시작하는 모든 파일을 보도록 하려면 어떻게 해야 합니까 /var/log/messages
?
파일 이름에는 공백이 표시되지 않습니다.
*
나는 PCRE처럼 행동하고 싶다\S*
고쳐 쓰다
정규 표현식은 지원되지 않으므로 sudo
여기에 새 질문을 만들었습니다.https://softwarerecs.stackexchange.com/questions/65887/sudo-alternative-which-supports-pcre
위의 예는 man sudoers
"명령줄 인수의 와일드카드 문자는 주의해서 사용해야 합니다" 섹션에서 가져온 것입니다.
답변1
sudoers 구문은 탈출구를 제공하지 않습니다. 래퍼 스크립트 작성을 제안할 수도 있지만(예: 첫 번째 인수를 제외한 모든 것을 무시하고 realpath
친구와 함께 정규화) 어쨌든 작동하지 않습니다.
sudo cat /var/log/messages/../../../etc/shadow
실제 사용 사례를 알지 못한 채 맨페이지의 예에 대해서만 언급할 수 있습니다. 실제 솔루션은 sudo를 전혀 사용하지 않고 ACL을 사용하는 것이라고 말하고 싶습니다. ACL을 사용하여 사용자에게 디렉터리의 모든 항목에 대한 액세스 권한을 부여하면 파일 시스템이 해당 액세스를 제한합니다.
답변2
귀하의 경우 가장 가까운 것은 다음과 같습니다.
%operator ALL = /bin/cat /var/log/messages*, !/bin/cat /var/log/messages*\ *
첫째, /bin/cat
로 시작하는 "매개변수 문자열"이 있는 경우에만 허용되며 /var/log/messages
, 동일한 "매개변수 문자열"은 임의의 지점에 공백이 있으면 금지됩니다.
이는 실제로 여러 인수를 허용하지 않지만 cat
"전체 문자열" 기준으로 sudo cat /var/log/messages /var/log/messages.1
허용하지 않는 만큼 많은 인수를 허용하지 않습니다 sudo cat /var/log/messages /etc/shadow
. 또한 가상 파일과 같이 합법적인 파일 이름에 공백이 포함되는 것을 허용하지 않습니다 /var/log/messages-with-' '-space
.
답변3
/usr/local/bin/cat-messages
첫 번째 선택은 외부에서 검증을 수행하는 사용자 정의 스크립트입니다 sudoers
.
#!/bin/bash
#
args=()
prefix='/var/log/messages'
for arg in "$@"
do
# Canonicalise
real=$(readlink -f "$arg")
# Check it is a real file matching the prefix
if [[ "$real" =~ ^"$prefix" ]] && [[ -f "$real" ]]
then
args+=("$arg")
else
echo "WARNING: skipping $arg" >&2
fi
done
cat "${args[@]}"
sudoers
다음과 같은 줄 에 추가할 수 있습니다 .
%operator ALL = NOPASSWD: /usr/local/bin/cat-messages
그리고 ( /usr/local/bin
당신의 것이라고 가정하면 PATH
) 이렇게 부르세요
sudo cat-messages /var/log/messages.1 /var/log/messages
실제로 이것은 쉘 스크립트이므로 sudo
자체 호출을 통해 사용자의 삶을 훨씬 더 단순하게 만들 수 있습니다. ( sudo
여전히 고려 대상 이므로 보안 문제는 없습니다 /usr/local/bin/cat-messages
.)
#!/bin/bash
#
[[ $(id -u) != 0 ]] && exec sudo "$0" "$@"
args=()
prefix='/var/log/messages'
... as before ...
이 변형을 다음과 같이 간단히 호출할 수 있습니다.
cat-messages /var/log/messages.1 /var/log/messages
또는
cat-messages /var/log/messages*