sudo 지원 스크립트를 보호하는 방법

sudo 지원 스크립트를 보호하는 방법

권한이 없는 사용자로 루트 명령을 실행하는 솔루션 -sudo 스크립트- 보안 취약성이 매우 높고 예상치 못한 동작 및 결과가 발생할 가능성이 높습니다(다른 솔루션(예: 바이너리 래퍼)에서도 마찬가지입니다 setuid).

분명히 스크립트는 아래와 같이 visudo를 사용하여 추가되었습니다.

www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/mycommand
  • ~해야 한다읽을 수 있는,쓰기 가능그리고루트로만 실행 가능- 소유자 및 그룹 모두 ( chown root:root mycommand; chmod 700 mycommand)
  • 그것을 가지고 있어야한다상위 디렉터리 소유권 root:root755패턴이 있는
  • 입력을 검증해야 합니다.- 매개변수 및 표준 입력 - 실행 거부 및 중단유효하지 않거나 예상치 못한제공된 데이터
  • 상대 경로/별칭(?) 대신 절대 경로를 사용해야 합니다.
  • Defaults env_reset설정 해야 합니다 /etc/sudoers(? 여기서 도움이 필요함)

sudo 지원 스크립트를 보호하기 위해 또 무엇을 할 수 있나요?

답변1

sudoers가장 좋은 방법 중 하나는 파일의 "Digest_Spec" 가능성을 사용하여 실행 파일의 체크섬을 확인하는 것입니다.

매뉴얼 페이지에서 발췌:

명령 이름 앞에 Digest_Spec이 붙은 경우 지정된 SHA-2 다이제스트를 사용하여 확인할 수 있는 경우에만 명령이 성공적으로 일치합니다.

openssl을 사용하여 체크섬을 생성합니다.

$ openssl dgst -sha224 /usr/local/sbin/mycommand
 SHA224(/usr/local/sbin/mycommand)=
         52246fd78f692554c9f6be9c8ea001c9131c3426c27c88dbbad08365 

그런 다음 sudoers 파일에서(같은 줄에):

 www-data ALL=(ALL) NOPASSWD: 
    sha224:52246fd78f692554c9f6be9c8ea001c9131c3426c27c88dbbad08365
    /usr/local/sbin/mycommand

답변2

스크립트 보호 기준 목록을 약간 수정하겠습니다. 다음과 같거나 유사한 항목을 고려하면 다음과 같습니다 /etc/sudoers.

www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/mycommand

스크립트를 선언할 수 있습니다.

  • 루트 사용자만 쓸 수 있어야 합니다.
  • 루트 사용자가 읽고 실행할 수 있어야 합니다.
  • 루트만 쓸 수 있는 디렉터리 계층 구조에 있어야 합니다.
  • 입력 내용은 사용을 위해 "충분히" 검증되어야 하며, 다른 콘텐츠는 거부됩니다.
  • 해당 작업을 수행하는 데 필요한 최소 권한 집합이 있어야 합니다(꼭 setuid 루트일 필요는 없음).
  • PATH외부 명령을 사용하기 전에 정의해야 합니다.
  • 모든 변수는 사용하기 전에 알려진 값으로 설정되어야 합니다.
  • 호출 시기와 방법뿐만 아니라 결과 작업도 보여주는 감사 추적이 생성되어야 합니다(생각해 보세요 logger).

또한 대부분의 경우 스크립트는 실제로 루트로 실행할 필요가 없습니다. 다른 계정에 대해 setgid 또는 setuid를 실행할 수 있습니다. 일반적으로 스크립트에 대한 전체 루트 액세스 권한을 부여하지 않으려면 다음 옵션을 고려하십시오.

SELinux 환경의 경우 스크립트가 예상치 못한 작업을 수행하지 못하도록 방지하는 정책을 생성할 수 있습니다. 포괄적인 루트 권한보다 더 세부적인 CAP_NET_ADMIN과 같은 기능도 고려해 볼 가치가 있습니다.

iptables단일 IPv4 주소의 유효성을 검사하고 이를 에 전달하려는 특정 사례에서는가능한비특정 옥텟 시리즈로 IP 주소를 확인하는 기능. 이 경우 444.555.666.999는 iptables실제 IP 주소가 아닌 모든 것을 거부하므로 합리적인 것으로 간주될 수 있습니다. 극단적인 경우에는 RE를 일치시키는 것만 /^[0-9.]+$/으로도 값을 에 전달하기에 충분하다고 생각할 수도 있습니다 iptables. 반면에, 많은답변StackExchange 및다른 장소들IP 주소 확인 문제를 해결합니다. 일부는 다른 것보다 낫습니다.

고려해야 할 특별한 경우는 RFC1918 주소, 멀티캐스트 주소 및 자체 외부 IP 주소 범위입니다. 아, 그리고 이전에 클래스 E로 알려진 예약된 블록이 있습니다. IPv6 지원이 필요합니까?

스크립트가 분당 수백 번 호출되면 어떻게 되나요? 이러한 가능성에 대비해야 합니까? 체인 iptables이 넘칠까요? 체인에 수백 개의 규칙이 필요하다고 생각되면 [사용ipset확장하다iptables선형 목록이 아닌 이것은아주 좋은 튜토리얼. 보호 측면에서는 수천 개의 컬렉션을 구축할 수 있습니다.수천) 규칙 세트를 통과하는 트래픽 흐름을 크게 늦추지 않고 유사한 규칙을 실행할 수 있습니다.

간단해 보이는 요청이 갑자기 상당히 복잡해집니다.

답변3

명명된 파이프 방법. 루트로 실행

mkfifo -m 666 /tmp/foo
/tmp/readpipe.sh &

그런 다음 사용자 www-data로 파이프에 쓸 수 있습니다.

echo test >>/tmp/foo

가장 간단한 형식의 readpipe.sh(taint가 있는 Perl이 더 좋습니다):

#!/bin/sh
while read A </tmp/foo
do
 echo received $A     
done

답변4

sudo 지원 스크립트를 보호하기 위해 수행할 수 있는 다른 작업: PAM - 플러그형 인증 모듈을 사용합니다.

PAM 관리자 가이드:http://www.linux-pam.org/Linux-PAM-html/Linux-PAM_SAG.html

PAM 모듈 작성자 가이드:http://www.linux-pam.org/Linux-PAM-html/Linux-PAM_MWG.html

PAM 애플리케이션 개발자 가이드:http://www.linux-pam.org/Linux-PAM-html/Linux-PAM_ADG.html

또한 /usr/share/doc/packages/pam/pdf 시스템의 PAM 버전과 관련된 문서가 있는지 확인하십시오.

PAM은 Linux의 기본 보안 메커니즘 중 하나입니다. 이는 많은 것을 보호하고 잠그는 데 사용되며, 두 가지 예는 로그인 프로세스와 비밀번호 변경 프로세스입니다. 이는 최소 문자 길이 및 만료 시간과 같은 비밀번호 제한을 적용할 때 PAM을 통해 수행됩니다. PAM이 핵심 시스템 프로세스에 충분하다면 스크립트에도 확실히 충분합니다. 먼저 PAM 시스템 관리 가이드를 확인하여 다음과 같은 이점을 이미 누릴 수 있는지 확인하세요.

  • pam_time: 사용자를 인증하지 않지만 대신 시스템 및/또는 특정 애플리케이션에 대한 액세스를 하루 중 다른 시간, 특정 요일 또는 다른 터미널 회선을 통해 제한합니다. 이름, 시간, 요일, 요청하는 서비스, 요청한 터미널을 기준으로 (개별) 사용자의 액세스를 거부하도록 모듈을 구성할 수 있습니다.

  • pam_env: 호출 시 환경 변수를 설정하거나 설정 해제합니다. pam 모듈을 만들 때 이를 활용하세요.

  • pam_localuser: 일반적으로 네트워크 사용자의 하위 집합과 특정 워크스테이션에 로컬인 일부 계정을 포함하는 사이트 전체 로그인 정책을 시행하는 데 도움이 됩니다. pam_wheel 또는 pam_listfile과 함께 pam_localuser를 사용하는 것은 로컬 사용자 및/또는 네트워크 사용자의 하위 집합으로 액세스를 제한하는 효과적인 방법입니다.

  • 목록은 계속됩니다. 시스템 관리자 안내서를 참조하여 필요에 따라 사용하십시오.

다음 내용도 유용할 수 있습니다.http://freecode.com/projects/pam_script/

여기에서 모듈 작성자 가이드와 애플리케이션 개발 가이드를 읽어볼 수 있습니다. 그게 바로 PAM의 목적입니다...플러그형인증 모듈. 효과적으로 코드를 작성하고 있으며, 아직 코딩을 하지 않은 경우 작업이 끝나면 프로그래머가 됩니다. 이는 Microsoft Windows처럼 일부 확인란을 클릭하여 활성화/비활성화하는 "IT" 항목이 아닙니다. PAM을 사용하는 이유는 시스템 관리자가 보안상의 이유로 모든 작업을 수행하기 위해 모듈(때때로 간단하거나 때로는 작성할 필요 없이)을 연결할 수 있기 때문입니다. 예를 들어, 사용자가 passwd자신의 비밀번호를 변경하려고 할 때 보안 목적으로 PAM을 사용하여 비밀번호를 변경하므로 비밀번호를 변경하기 위해 "sudo passwd"를 입력할 필요가 없습니다. 스크립트에서 수행해야 하는 작업에 따라 PAM을 올바르게 사용하고 스크립트의 소유권과 SUID/GUID를 다음과 같이 설정하면 sudo가 필요하지 않을 수도 있습니다 /usr/bin/passwd.

이를 보장하기 위해 내가 또 무엇을 할 수 있는지 [자신에게] 묻는다면... 이것이 무언가를 하는 최선의 방법이 아니라는 신호일 수 있습니다. 이 경우 sudo를 사용하여 실행 중인 스크립트/실행 파일에 높은 권한을 부여하세요. 대신, Linux의 이미 확립된 메커니즘이 이와 같은 일을 어떻게 처리하는지 살펴보십시오. 예를 들어 사용자가 /usr/bin/passwd 루트 소유의 파일을 편집하고 /etc/passwd수정하려면 루트 권한이 필요한 경우입니다. /etc/shadowPAM을 사용하면 사용자 ID, 그룹 ID, 로컬 사용자 계정 등을 기준으로 주어진 시간 내에 스크립트를 실행할 수 있는 사람을 제한할 수 있습니다. 한 단계 더 나아가 해당 사용자만으로 스크립트를 실행하기 위한 목적으로 자신의 비밀번호를 사용하여 별도의 그룹 계정을 생성할 수 있으며, 그런 다음 스크립트를 실행하기 위해 루트 비밀번호를 제공하지 않을 것입니다. 루트로 로그인할 수 있는 사용자에 대해서만 휠 그룹 구성표를 따르게 됩니다. 도움이 되었기를 바랍니다.

관련 정보