[unix] 특정 사용자에 대한 auth.log에서 sudo PAM 메시지를 중지하는 방법은 무엇입니까?

내 환경을 모니터링하기 위해 Zabbix를 사용하고 있으며 60 초마다 사용자 정의 스크립트 zabbix_agentd를 사용자로 실행합니다 zabbix. sudo이 스크립트를로 실행 하는 데 사용 됩니다 root.

에서 /var/log/auth.log나는 60 초마다 참조 :

Aug 11 17:40:32 my-server sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Aug 11 17:40:32 my-server sudo: pam_unix(sudo:session): session closed for user root

이 메시지가 로그를 넘치지 않게하려고합니다. 나는 /etc/pam.d/sudo바로 다음 줄을 파일에 추가했다 session required pam_unix.so.

session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet uid = 0

메시지가 사라졌습니다.

그러나 문제는 누군가가 함께 스크립트를 실행 때마다 PAM 메시지를 억제 한 것을이 방법 sudo으로 root.

zabbix다른 사용자가 아닌 사용자에 대해서만 메시지를 중지하고 싶습니다 . 사용자가 특권으로 스크립트를 실행하려는 sudo것을 알고 있으며 PAM에게이를 알리는 방법이 있습니까? PAM에게 사용할 때 특정 사용자에 대해 기록하지 않도록하려면 어떻게 해야합니까?zabbixrootsudo

참고 : syslog에서 메시지를 필터링하려고했습니다. 이것은 작동하지만 로그 메시지가 어떤 사용자가 루트가되고 있는지를 나타내지 않기 때문에 위와 동일한 문제, 즉 너무 무차별하다는 문제가 있습니다.



답변

PAM conf 라인과 매우 비슷해 보입니다.

session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet uid = 0

에 대한 매뉴얼 페이지를 보면 pam_succeed_if요청하는 사용자 ( ruser)가 테스트하고 싶다고 생각합니다 zabbix.

그래서 나는 제안한다 :

session [success=1 default=ignore] pam_succeed_if.so quiet uid = 0 ruser = zabbix

사용자 zabbix가 될 때 다음 테스트는 억제 root되지만 다른 전환은 없습니다. 나는 내 자신의 사용자 쌍으로 이것을 테스트했습니다.

루트가 아닌 사용자가되는 uid = 0것에 대해 조용히하려면 위 의 테스트를 제거하십시오 zabbix.

service in sudo테스트를 제거 했습니다 /etc/pam.d/sudo. 이 행이 인 경우 중복됩니다 .


답변

Toby의 답변을 바탕으로 Debian / Ubuntu에서 약간 다르게 구성하는 방법을 찾았습니다. 컨텍스트는 다음을 참조하십시오.

따라서 데비안 / 우분투에는이 pam-auth-update명령이 있으며 살펴보면 /etc/pam.d/sudo다음과 같습니다.

#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

/etc/pam.d/common-session-noninteractive모양이 맘에 :

#
# /etc/pam.d/common-session-noninteractive - session-related modules
# common to all non-interactive services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define tasks to be performed
# at the start and end of all non-interactive sessions.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules.  See
# pam-auth-update(8) for details.

# here are the per-package modules (the "Primary" block)
session [default=1]         pam_permit.so
# here's the fallback if no module succeeds
session requisite           pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
session required    pam_unix.so
# end of pam-auth-update config

따라서 위의 파일 중 하나를 편집 할 수는 있지만 분명히 여기에는 “더 높은 성능”이 있습니다. pam 규칙을 추가하려는 다른 패키지에서 변경 사항을 적용하려면 어떻게해야합니까? 그것을 끝내기 위해, 나는 이렇게 /etc/pam.d/sudo두 개의 사이에 줄을 추가 할 수없는 것처럼 보였습니다 @include.

##### THIS DIDN'T WORK :( ######
@include common-auth
@include common-account
session [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser
@include common-session-noninteractive

위의 링크를 읽기뿐만 아니라 다른 예 (참조 후 /usr/share/pam-configs/unix) 나는,이 함께했다 /usr/share/pam-configs/myapp:

# Don't log "session opened" messages for myapp user
# See: https://wiki.ubuntu.com/PAMConfigFrameworkSpec
#      https://manpages.debian.org/stretch/libpam-modules/pam_succeed_if.8.en.html
Name: myapp disable session logging
Default: yes
Priority: 300
Session-Type: Additional
Session:
    [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser

SessionSession-Type제어 파일을 편집하는 및 Priority주문을 정의 그들은에서 이동합니다. 해당 파일을 추가하고 실행 한 후 pam-auth-update, /etc/pam.d/common-session-noninteractive하단에 (이 같은 모습을 🙂

#... omitted
session required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
session [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser
session required pam_unix.so
# end of pam-auth-update config

… 우리 pam_succeed_if선이 먼저 와야하기 때문에 우리가 원하는 것 session required pam_unix.so입니다. (그 라인에서 유래 /use/share/pam-configs/unix하고있다 Priority: 256가 두 번째 끝 때문에.) 나는 왼쪽 것이 주 service = sudo이후 술어를 common-session-noninteractive힘도 이외의 다른 CONFIGS에 포함 sudo.

제 경우에는 이미 코드를 .deb 설치 프로그램으로 패키지 했으므로 /usr/share/pam-configs/myapp파일을 추가 하고 스크립트에 추가 pam-auth-update --package했습니다 .postinstprerm

경고…

위에서 링크 한 PAMConfigFrameworkSpec 기사 를 읽으면 Session-Interactive-Only옵션을 정의 하지만 비대화 형 규칙 만 지정할 수있는 방법없습니다 . 그래서 /etc/pam.d/common-session도 업데이트 . 나는 이것 주위에 방법이 있다고 생각하지 않습니다. 해당 사용자에 대해 대화 형 세션이 기록되지 않은 경우 (서비스 계정입니까?) 모든 설정이 완료되었습니다.

보너스 : sudo 로그 출력을 제거하는 방법

받는 사람 또한 session openened|closedPAM의를 방출하는 선 sudo달린다 명령에 대한 추가 정보를 기록합니다. 다음과 같이 보입니다 :

[user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...

이 경우 그를 제거하려면, 다음 아래의 계속이 링크를 열 …

따라서 … /etc/sudoers.d/___일부 작업에는 수퍼 유저 권한이 필요한 서비스 계정에 대해 다음과 같은 작업을 수행 할 수있는 일반적인 설정에 익숙 할 것입니다.

myuser ALL=(ALL) NOPASSWD: /bin/ping

그럴 수도 있습니다 /etc/sudoers.d/10_myuser. 글쎄, 당신은 또한 지정할 수 있습니다Defaults . 구체적으로이 구문에 유의하십시오'Defaults' ':' User_List

이제 SUDOERS OPTIONS 섹션을보십시오 . 재미있는 비트 포함 log_input, log_output하지만 (아마도) 더 중요한 것은, syslog하고 logfile. 최신 데비안 버전에서는 rsyslog 또는 sudolog stdout또는 stderr기본적으로 표시됩니다. 그래서 나에게 이것은 내 서비스의 저널 로그에 표시되었지만 /var/log/auth.log내 응용 프로그램 로그와 섞이지 않는 위치는 아닙니다. sudo 로깅을 제거하기 위해 다음과 같이 추가 /etc/sudoers.d/10_myuser했습니다.

Defaults:myuser !logfile, !syslog
myuser ALL=(ALL) NOPASSWD: /bin/ping

YMMV, 로깅을 비활성화하면 보안 감사에 문제가 발생한다고 생각되면 rsyslog 필터를 통해이 문제를 해결할 수도 있습니다.


답변

꽤 무서운 테스트와 연구 끝에 Debian Stretch (Raspberry)에 대한 효과적인 솔루션을 찾았습니다. OP가 요구하는 것을 달성하는 방법은 여러 가지가 있습니다. 그러나 PAM 문서는 압도적이므로 대부분의 자료는 실제로 TL; DR입니다.

  1. 다음 을 사용하여 rsyslog 에 대한 사용자 정의 문자열 필터를 추가 할 수 있습니다 /etc/rsyslog.d/anyname.conf.
    :msg, contains, "session opened for user root by pi" stop
  2. 직접 편집 할 수 있습니다 /etc/pam.d/sudo
  3. 다음에 사용자 지정 PAM 구성 파일을 만들어 올바른 방법으로 수행 할 수 있습니다. /usr/share/pam-configs/
  4. 다음에 사용자 정의 sudoers 파일을 작성하여 일부를 수행 할 수 있습니다 ./etc/sudoers.d/020_pi

(2)와 (4)를 수행하는 방법을 보여 드리겠습니다.

경고

/etc/pam.d/월드 쓰기 권한을 먼저 변경하지 않고는 파일을 편집하지 마십시오 . 실수하지 않으면 나중에 sudo / su를 사용하지 못하게 될 수 있습니다 ! 새 설정을 다시 변경하기 전에 테스트했는지 확인하십시오. (기본값은 644 )


“세션 열기 / 닫기”를 제거하려면 :

다음 /var/log/auth.log스팸을 제거하고 싶습니다 .

May 10 11:28:03 xxx sudo[26437]: pam_unix(sudo:session): session opened for user root by (uid=0)
May 10 11:28:07 xxx sudo[26437]: pam_unix(sudo:session): session closed for user root

이 작업을 수행:

# sudo chmod 666 /etc/pam.d/sudo
# sudo cat /etc/pam.d/sudo

#%PAM-1.0

@include common-auth
@include common-account
session [success=1 default=ignore] pam_succeed_if.so quiet_success uid = 0 ruser = pi
@include common-session-noninteractive

여기서 중요한 점은 success=1성공하면 다음 1 절 (또는 PAM 용어 “스택의 다음 모듈로 점프”)을 건너 뛰는 것을 의미한다는 것입니다.

보낸 사람 man pam.conf:

무시 -모듈 스택과 함께 사용하면 모듈의 반환 상태는 응용 프로그램이 얻는 반환 코드에 영향을 미치지 않습니다.

done- 모듈 스택을 종료하고 PAM이 즉시 응용 프로그램으로 돌아 오는 부작용으로 ok와 동일합니다.

N- 스택에서 다음 N 모듈 위로 건너 뛰는 부작용과 함께 ok와 같습니다.

그런 다음 재부팅하고 몇 시간 동안 실행하여 (예 : cron 작업 확인) 이것이 작동하는지 테스트하십시오. 그런 다음 파일 권한을 복원해야합니다. 그렇지 않으면 시스템에 보안 허점이 생길 수 있습니다. ( sudo chmod 644 /etc/pam.d/sudo)


반복 된 “TTY PWD COMMAND”메시지를 제거하려면 다음을 수행하십시오.

또한 다음과 같은 메시지를 제거하고 싶습니다.

May 11 18:23:20 xxx sudo:       pi : TTY=unknown ; PWD=... ; USER=root ; COMMAND=/usr/bin/arp-scan -q -l

필자의 경우 이것은 몇 분마다 arp-scan 을 실행하는 IDS 스크립트에 의해 생성되었습니다 . 로그에 표시되지 않게하려면 다음 파일을 작성하십시오.

# sudo nano /etc/sudoers.d/020_pi
# sudo cat /etc/sudoers.d/020_pi

Defaults:pi     !logfile, !syslog
pi xxx = (root) NOPASSWD: /usr/bin/arp-scan

(여기서는 xxx컴퓨터 이름이며 pi사용자 이름입니다.)


답변

당신은 얻을 것이다 :

pam_succeed_if(sudo:session): unknown attribute "ruser"

당신의 대답으로.

#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive
session     [success=1 default=ignore] pam_succeed_if.so service in zabbix quiet use_uid
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

작동하지만 여전히 얻을 수 있습니다 :

pam_unix(sudo:session): session opened for user root by (uid=0)

당신의 로그에.


답변