저는 주로 학습과 테스트를 위해 사용하는 홈 웹 서버를 가지고 있습니다. 저는 Debian Bullseye에서 Apache2를 사용하고 있습니다.
내가 가지고 놀았던 것 중 하나는 PHP를 사용하여 웹 서버에서 Bash 스크립트를 실행하는 것입니다. 이러한 스크립트 중 일부에는 사용자 세션 종료, Apache에서 가상 서버 시작 또는 중지와 같은 작업을 수행하기 때문에 sudo가 필요합니다.
이러한 스크립트는 공용 디렉터리 외부에 있으며 사용자 계정(www-data 그룹)이 소유합니다. 권한은 소유자=rwx, 그룹=x, 기타=없음입니다.
www-data 사용자에게 sudo 액세스 권한이 있습니다
www-data ALL=(root) NOPASSWD: /path/to/scripts.sh
웹 서버에 sudo 액세스 권한을 부여하는 것은 나쁜 생각이지만 더 나은(더 안전한?) 방법을 생각할 수 없다는 기사를 읽은 적이 있습니다. setuid를 고려했지만 이것이 더 안전한 옵션인지 확실하지 않습니다.
높은 권한으로 스크립트를 실행해야 하는 경우 안전한 방법은 무엇입니까? 아니면 sudo가 특정 스크립트만 허용하는 것이 최선의 접근 방식입니까?
감사해요
답변1
웹 서버 사용자(이 경우 www-data)에게 sudo 액세스 권한을 부여하면 웹 서버에서 실행되는 모든 스크립트가 잠재적으로 높은 권한으로 임의 명령을 실행할 수 있으므로 보안 위험이 발생할 수 있습니다. 이는 스크립트가 적절하게 삭제 및 검증되지 않은 경우 시스템이 명령 주입 및 기타 공격에 노출될 수 있으므로 특히 위험할 수 있습니다.
보다 안전한 대안은 특정 스크립트에 상승된 권한을 부여하는 보다 세분화된 접근 방식을 사용하는 것입니다. 예를 들어 웹 서버 사용자에게 sudo 액세스 권한을 부여하는 대신 sudoer와 같은 도구를 사용하여 특정 사용자나 그룹에게 상승된 권한으로 특정 명령을 실행할 수 있는 권한을 부여할 수 있습니다.
귀하의 경우 스크립트의 정확한 경로를 지정하고 www-data만 sudo를 사용하여 스크립트를 실행할 수 있도록 허용하여 이 작업을 수행했습니다. 이는 스크립트가 필요한 작업을 수행할 수 있도록 허용하면서 남용 가능성을 제한하기 때문에 좋은 접근 방식입니다.
고려해야 할 또 다른 옵션은 별도의 프로세스나 서비스를 사용하여 높은 권한이 필요한 작업을 수행하는 것입니다. 예를 들어 웹 서버의 요청을 수신하고 높은 권한으로 필요한 명령을 실행하는 데몬이나 시스템 서비스를 작성할 수 있습니다. 이는 웹 서버에서 권한 있는 작업을 더욱 격리하고 잠재적인 보안 위험을 제한하는 데 도움이 됩니다.
전반적으로, 모든 사용자나 프로세스에 상승된 권한을 부여하는 것이 보안에 미치는 영향을 신중하게 고려하고 세분화된 접근 방식을 사용하여 잠재적인 위험을 제한하는 것이 중요합니다.
제가 드릴 수 있는 최신 조언은 웹 서버의 Selinux 구성을 살펴보고 Selinux를 사용하여 프로세스 시스템 호출을 제한할 수 있다는 것입니다.
답변2
스크립트/명령이 안전하게 실행된다면 sudo
/ SUID
문제가 되지 않습니다.
보안 스크립트/프로그램을 만드는 방법은 Stackexchange 응답이 아닌 책에 답변되어 있습니다...
귀하의 경우에는 상승된 권한을 가진 모든 명령에 실제로 루트 권한이 필요한지 여부를 고려하는 것이 합리적일 수 있습니다. 예를 들어, 사용자의 프로세스를 종료하기 위해 해당 사용자가 되는 것만으로는 충분하지 않습니다 root
.
허용된(또는 허용되지 않는) 사용자를 열거 sudoers
하거나 래퍼 스크립트를 사용하여 UID가 1000 이상인지 확인할 수 있습니다(사용자 계정이 시작되는 곳이라고 가정).
루트 프로세스 제한 사항
루트로 실행되는 프로세스의 기능을 제한하기 위해 수행할 수 있는 작업이 많이 있습니다. 가장 쉬운 방법은 아마도 (인스턴스화된) Systemd 서비스를 사용하는 것입니다. 또는 systemd-run
이를 통해 쉽게 액세스할 수 있기 때문입니다 man systemd.exec
. 예를 들어 매우 제한된 파일 시스템 액세스만 필요하고 웹 서버 다시 로드/다시 로드 시작을 트리거하는 데 네트워크 액세스는 필요하지 않습니다.