"sudo su -"에 명령을 기록하는 방법은 무엇입니까?

"sudo su -"에 명령을 기록하는 방법은 무엇입니까?

만약 내가:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 

그러면 로그에서 다음을 볼 수 있습니다.

[root@notebook /var/log] grep 123456uu *
auth.log:Jan  9 17:01:51 notebook sudo: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 123456uu
[root@notebook /var/log] 

하지만 만약 내가:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 

로그에 표시되지 않습니다.

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 

내 질문: "sudo su -" 명령에 대한 로깅을 어떻게 켜나요?

운영 체제는 Ubuntu 12.04이지만 문제가 일반적입니다.

업데이트 #1:

[user@notebook ~] sudo su -
[sudo] password for user: 
[root@notebook ~] echo zizizi
zizizi
[root@notebook ~] cd /var/log
[root@notebook /var/log] grep -iIR 'zizizi' *
[root@notebook /var/log] grep 'COMMAND=/bin/su -' *
auth.log:Jan 10 15:42:42 notebook sudo: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/su -
[root@notebook /var/log]

답변1

Ubuntu 12.04를 사용하고 있으므로 log_input및 옵션을 통해 log_output활성화된 I/O 로깅 기능을 살펴보세요.

log_input

    설정된 경우 sudo명령은 의사 tty에서 실행되고 모든 사용자 입력이 기록됩니다. I/O 리디렉션이나 명령이 파이프의 일부이기 때문에 표준 입력이 사용자의 tty에 연결되지 않은 경우 해당 입력도 캡처되어 별도의 로그 파일에 저장됩니다.

    일반 sudo 로그 줄에 포함된 고유 세션 ID(접두사가 .sudo임)를 사용하여 iolog_dir이 옵션으로 지정된 디렉터리에 입력을 기록합니다(기본값) . 이 옵션을 사용하여 세션 ID 형식을 제어할 수 있습니다./var/log/sudo-ioTSID=iolog_file

    사용자 입력에는 암호(화면에 표시되지 않더라도)와 같은 민감한 정보가 포함될 수 있으며 이는 암호화되지 않은 상태로 로그 파일에 저장됩니다. 대부분의 경우 단순히 log_output을 통해 명령 출력을 기록하는 것으로 충분합니다.

log_output

    설정된 경우 sudo명령은 pseudo-tty에서 실행되며 script(1) 명령과 유사하게 화면으로 전송된 모든 출력이 기록됩니다. I/O 리디렉션 또는 명령이 파이프의 일부이기 때문에 표준 출력 또는 표준 오류가 사용자의 tty에 연결되지 않은 경우 해당 출력도 캡처되어 별도의 로그 파일에 저장됩니다.

    출력은 일반 sudo 로그 줄(기본적으로)에 포함된 고유 세션 ID를 사용하여 이 옵션으로 지정된 디렉터리에 기록됩니다 iolog_dir. 이 옵션은 세션 ID 형식을 제어하는 ​​데 사용할 수 있습니다./var/log/sudo-ioTSID=iolog_file

    출력 로그는 sudoreplay(8) 유틸리티를 사용하여 볼 수 있으며, 사용 가능한 로그를 나열하거나 검색하는 데에도 사용할 수 있습니다.

구현: Sudo 버전 최소: 1.7.4p4가 필요합니다.

/etc/sudoers편집: 필요한 모든 sudoers 항목에 두 개의 태그(명령 또는 별칭을 사용하여 "su"가 지정된 경우)를 추가하기만 하면 됩니다. 로그 입력 및 로그 출력.

예:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL

다음 기본 로그 디렉터리 구조를 에 추가합니다 sudoers.

Defaults iolog_dir=/var/log/sudo-io/%{user}

답변2

당신 이 실행 중이 아니기 때문에 grepwhile 작업이 실패합니다 . 당신은 실행 중이므로 쉘이 시작됩니다. 그러면 쉘이 .sudo su -echo 1234567zzsu -echo

이는 의도적인 것입니다. 모든 명령 실행을 기록하면 시스템 로그가 쓸모없는 정보로 채워집니다(보통 보이지 않는 뒤에서 실행되는 수많은 프로그램이 있습니다).

grep을 변경하면 grep 'COMMAND=/bin/su -' *표시됩니다.


sudo su -그것은 또한 쓸모가 없습니다 su. sudo -i같은 일을하십시오.

답변3

복잡성이 추가되면서 "sudo su -"에서 실행된 명령을 기록하는 세 가지 방법이 있습니다.

  1. Bash 명령 기록에 의존
  2. execve 로깅 래퍼 설치
  3. SELinux를 사용하여 감사

어느 것이 적절한지는 로깅을 통해 달성하려는 목표에 따라 다릅니다.

1) Bash 명령 기록

충분한 행이 유지되고, 다른 세션에서 덮어쓰여지지 않고, 명령이 무시되지 않고, 타임스탬프가 적절하게 표시되도록 기록 도구를 구성해야 할 수도 있습니다. (HIST* 변수 참조배쉬 매뉴얼). 기록 파일을 편집하거나, 환경을 조작하거나, 다른 셸을 실행하면 쉽게 손상될 수 있습니다.

2) 래퍼 실행

스누피 레코더하나입니다. /etc/profile로거 라이브러리가 프로세스의 메모리 맵( )에 있는지 확인 /proc/<pid>/maps하고 그렇지 않은 경우 이를 설정 LD_PRELOAD하고 다시 시작합니다(사용 exec $SHELL --login "$@"). $LIB/snoopy.so또는 /etc/ld.so.preload에 항목을 사용하거나 추가할 수 있습니다.등가 경로snoopy.so의 32/64비트 버전으로.

더 어렵지만 LD_PRELOAD스누핑 코드가 더 이상 실행되지 않도록 실행 환경을 조작하여 위의 환경 변수 버전을 손상시킬 수 있습니다.

콘텐츠를 신뢰할 수 있도록 시스템 로그를 즉시 전송해야 합니다.

3) 검토

구성은 execve 래퍼보다 약간 간단하지만 여기에서 정보를 추출하는 것이 더 어렵습니다. 이는 "사용자가 명령을 실행한 후 시스템에 미치는 영향을 기록할 수 있는 방법이 있습니까? sudo su -" 라는 질문에 대한 대답입니다. 콘텐츠를 신뢰할 수 있도록 시스템 로그를 즉시 전송해야 합니다.

이것서버 장애 답변auditd와 함께 사용하기 위한 상당히 포괄적인 구성처럼 보입니다.

다른 제안사항도 있습니다서버 장애에 대한 비슷한 질문.

답변4

다른 사람들이 말했듯이, sudo당신은 이것을 할 수 없습니다.

대신 auditd로그인하려면 .if를 사용하세요.모든 것루트로 수행하려면(예: crontab으로 수행된 작업 포함) 다음을 사용하십시오.

sudo auditctl -a exit,always -F euid=0

ETA: 모든 것을 기록하면 성능에 영향을 미치므로 이에 대해 몇 가지 제한을 두는 것이 좋습니다. 예시를 참조하세요 man auditctl.

원래 로그인 uid가 루트가 아닌 시스템 호출만 기록하려면 다음 명령을 사용하십시오.

sudo auditctl -a exit,always -F euid=0 -F auid!=0

로그는 일반적으로 /var/log/audit/audit.log에서 끝납니다. 를 사용하여 검색할 수 있습니다 ausearch.

및 의 매뉴얼 페이지에 더 많은 정보가 있습니다 auditctl.audit.rulesausearch

관련 정보