보안상의 이유로(예: 주소 무작위화) 모든 사용자가 커널의 dmesg를 읽도록 허용하지 않는 것이 합리적이라는 것을 알고 있습니다. Linux에서는 다음 명령을 사용하여 dmesg를 루트 사용자로 제한할 수 있습니다 sysctl -w kernel.dmesg_restrict = 1
.
이 sysctl은 dmesg를 사용하려는 모든 사람에게 접두사를 추가하도록 강제하는데 sudo
, 이는 나에게 문제가 됩니다.
나는 그 사이에 뭔가를 원했습니다. 내 컴퓨터의 특정 사용자 계정이 sudoless 없이 dmesg에 액세스할 수 있기를 원하지만 Apache와 같은 데몬이나 www-data와 같은 비사용자 계정은 그렇지 않습니다.
이상적으로 dmesg 액세스는 특정 그룹(예: adm
)으로 제한됩니다.
가장 깨끗한 방법은 무엇입니까?
각주:
1 나는 sudo라는 개념을 좋아하지만 그것이 4글자 단어여야 한다고 믿습니다. 현명한 사람들은 다른 어떤 것도 충분하지 않은 드문 경우를 위한 완벽한 별명으로 그것을 현명하게 사용합니다. 불행하게도 이제 사람들은 두 번 생각하지 않고 sudo를 사용하여 많은 일상적인 작업을 수행하는 것을 봅니다. 사람들이 sudo를 과도하게 사용하는 습관을 갖게 만드는 것은 잠재적인 커널 주소 유출보다 더 심각한 보안 문제입니다.
² 일부 솔루션(예: chmod 4750 /bin/dmesg
.
고쳐 쓰다: Ikkachu의 솔루션을 수락했지만 setcap
향후 Linux 버전에서는 더 명확하고 일반적인 답변을 원합니다. 아마도 0(모든 사람)과 1(루트만) 사이의 dmesg_restrict에 대한 세 번째 sysctl 설정을 사용하면 시스템 관리자가 신뢰할 수 있는 그룹을 지정할 수 있습니다.
답변1
dmesg
"sudoless" 가 명령줄에 무언가를 쓸 수 있다는 의미라면 가장 간단한 해결책은 sudo를 /bin/dmesg
호출하는 스크립트를 만들고 sudo
비밀번호를 입력하지 않고도 sudo가 실행되도록 구성하는 것입니다.
따라서 다음과 같습니다.
echo 'username ALL = NOPASSWD:/bin/dmesg ' >> /etc/sudoers
cat <<'EOF' > ./dmesg
#!/bin/sh
sudo /bin/dmesg "$@"
EOF
chmod +x ./dmesg
./dmesg
그런 다음 경로 어딘가에 두십시오 .
커널 메시지 버퍼를 거치지 않고 직접 읽을 수 있어야 하는 다른 프로그램이 없다면 setuid를 /bin/dmesg
설정하는 데에도 /bin/dmesg
동일한 제한이 있습니다. 단순히 setuid를 실행하는 것보다 이를 실행하는 것이 더 안전할 수 있습니다 sudo
.
그런데, 읽으려고 해도 권한을 변경해도 /dev/kmsg
작동하지 않습니다. 시스템 호출 dmesg
로 돌아갑니다 .syslog(2)
그것만으로는 충분하지 않다면 할 수 있을 것입니다.능력. sysctl은 dmesg_restrict
로그 읽기를 를 사용하는 프로세스로 제한하므로 CAP_SYSLOG
이를 설정하기만 하면 됩니다.
따라서 다음과 같습니다.
# cp /bin/dmesg /bin/dmesg.capable
# chown .adm /bin/dmesg.capable
# chmod 710 /bin/dmesg.capable
# setcap cap_syslog=ep /bin/dmesg.capable
이제 이 그룹의 사용자는 로그를 볼 adm
수 있습니다 ./bin/dmesg.capable
그러나 이러한 기능은 대부분 액세스 제어 시스템의 나머지 부분을 우회하는 방법을 제공하기 때문에 악명이 높습니다. 물론 전체 루트로 실행하는 것 CAP_SYSLOG
보다 권한을 부여하는 것이 더 나을 수도 있습니다.dmesg
마음에 드는 다른 옵션으로는 SELinux seccomp
와 특정 그룹이 로그를 읽을 수 있도록 하는 간단한 구식 커널 패치가 있습니다.