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


12

만약 내가:

[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-"내의 명령에 대한 로깅을 어떻게 설정할 수 있습니까?

OS는 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]

악의적 인 사람 (또는 신뢰할 수없는 사람)이에 액세스 sudo su -할 수있는 경우 자신이 수행 할 수있는 모든 로그 항목을 제거 할 수도 있습니다. 로깅을 100 % 확실하게하려면 sudo크게 제한 하고 sudo su완전히 허용하지 않아야합니다.
와일드 카드

답변:


17

Ubuntu 12.04를 사용하고 있으므로 log_inputlog_output옵션을 통해 활성화 된 I / O 로깅 기능을 살펴보십시오 .

log_input

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

    입력은 일반 sudo 로그 행에 포함 된 접두사가있는 고유 세션 ID를 사용하여 iolog_dir옵션 ( /var/log/sudo-io기본적으로)으로 지정된 디렉토리에 기록됩니다 TSID=. 이 iolog_file옵션은 세션 ID의 형식을 제어하는 ​​데 사용될 수 있습니다.

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

log_output

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

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

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

구현 : Sudo 버전 이상 : 1.7.4p4 필요

/etc/sudoers수정 : 필요한 모든 sudoers 항목 (명령 또는 별명으로 "su"가 지정된 위치)에 두 개의 태그를 추가하기 만하면됩니다. LOG_INPUT 및 LOG_OUTPUT.

예:

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

다음과 같은 기본 로그 디렉토리 구조를 추가하십시오 sudoers.

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

훌륭하지만 구형 시스템에서는 작동하지 않습니다. : \
newuser999

아마도 현재 sudo 버전의 패키지를 만들거나 시스템을 업그레이드 하시겠습니까?
Martin M.

13

당신의 grep일을 sudo su -실행하지 않는 때문에 실패 echo 1234567zz, 실행중인 su -, 어떤 출시 쉘을. 그런 다음 쉘에서을 실행합니다 echo.

이것은 의도적이며 모든 단일 명령 실행을 기록하면 syslog에 쓸모없는 정보가 넘치게됩니다 (보통 보이지 않는 장면 뒤에서 실행되는 수많은 프로그램이 있습니다).

grep을 변경 grep 'COMMAND=/bin/su -' *하면 그것을 볼 수 있습니다.


sudo su -또한 쓸모없는 사용입니다 su. sudo -i같은 일을합니다.


"sudo su-"를 어떻게 기록 할 수 있습니까?
newuser999

1
기록됩니다. grep 'COMMAND=/bin/su -' *(또는 와일드 카드없이) 시도 했습니까 grep 'COMMAND=/bin/su -' /var/log/auth.log?
Patrick

질문을 업데이트했습니다. "sudo su-"를 사용할 때 명령이 기록되지 않았다는 것을 증명해야하는 것은 무엇입니까 ??
newuser999

4
명령 ( sudo -) 기록되고 업데이트 된 출력에이 내용이 표시됩니다. 그것이 우리가 여기서 말하는 전부입니다. 다른 명령, 등 등은 echo당신과 함께 사용자를 전환 한 후 sudo -, 없는 명령을 sudo는, 로그인하지 않은 (내 대답에 따라) 따라서 및 auth.log. 명시 적으로 시작된 개별 명령 만 sudo기록됩니다. 따라서 수퍼 유저로 전환 한 사실에 관계없이 sudo echo기록되지만 평범 echo하지는 않습니다.
goldilocks

12

복잡성이 증가함에 따라 "sudo su-"내에서 실행 된 명령을 기록하는 세 가지 방법이 있습니다.

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

어느 것이 적합한지는 실제로 로깅으로 달성하려는 것에 달려 있습니다.

1) 배쉬 커맨드 히스토리

다른 세션에서 덮어 쓰지 않고, 명령을 무시하지 않고, 타임 스탬프를 무시하지 않고 충분한 행을 유지하도록 히스토리 기능을 구성하려고합니다. ( bash 매뉴얼 의 HIST * 변수를 참조하십시오 ). 히스토리 파일 편집, 환경 조작 또는 다른 쉘 실행으로 쉽게 파괴 할 수 있습니다.

2) execve wrapper

스누피 로거 는 하나입니다. 에 체크를 추가 /etc/profile로거 라이브러리는 프로세스의 메모리 맵 (에 있음 /proc/<pid>/maps)하고, 그렇지 않은 경우, 세트 LD_PRELOAD및 재시작 (과 exec $SHELL --login "$@"). 다른 방법으로 당신은과 /etc/ld.so.preload 파일에 항목을 추가 할 수 있습니다 $LIB/snoopy.so또는 해당 경로 (들) snoopy.so 당신의 64분의 32 비트 버전.

더 어려운 것은 아니지만 LD_PRELOAD스누피 코드가 더 이상 실행되지 않도록 실행 환경을 조작하여 위 의 환경 변수 버전을 여전히 파괴 할 수 있습니다.

내용을 신뢰할 수 있으려면 Syslog를 즉시 발송해야합니다.

3) 감사

execve 랩퍼보다 구성이 약간 더 간단하지만 정보를 추출하기가 더 어렵습니다. 이것이 실제로 묻는 질문에 대한 답변입니다. "사용자가 문제를 발행 한 후 시스템에 어떤 영향을 미쳤는지 기록 할 수있는 방법이 있습니까? sudo su -" 내용을 신뢰할 수 있으려면 Syslog를 즉시 발송해야합니다.

Serverfault 답변 은 감사와 함께 사용하기에 매우 포괄적 인 구성 인 것 같습니다.

serverfault와 비슷한 질문에 대한 다른 제안이 있습니다 .


9

왜?

그것이 sudo로깅을 수행하고 있기 때문 입니다. sudo 명령을 기록합니다. 첫 번째 경우 sudo echo에는 기록됩니다. 두 번째 경우 sudo su에는 기록됩니다 (에서 찾으십시오 /var/log/auth.log).

su"사용자 전환"이며 기본적으로 root입니다. 그 후에는 아무것도 통과하지 못합니다 sudo. 루트로 로그인 한 것과 거의 같습니다. 로그인 자체는 기록되지만 각각의 모든 명령은 기록되지 않습니다.


5

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

대신을 사용하십시오 auditd. 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.rules및 의 매뉴얼 페이지에 자세한 정보가 있습니다 ausearch.


2
감사 로그를 신뢰할 수 있으려면 별도의 서버로 보내야합니다. 신뢰할 수없는 사용자가 루트가있는 컴퓨터에있는 모든 로그는 신뢰할 수 없습니다.
Jenny D

그럼에도 불구하고 손상된 서버에서 나오는 것이 무엇인지 신뢰할 수 없습니다.
Matt

그러나 타협 할 때까지 추적 할 수 있습니다.
Jenny D

2
op의 경우에는 기술적으로 실행 되 자마자 sudo su -광장 1로 돌아옵니다
Matt

신뢰할 수 없음은 타협 된 것과 다릅니다. 원격 서버의 감사 로그에 누가 감사 대상이 아닌지를 포함하여 수행 한 작업과 수행 대상을 표시하는 악의적 인 작업을 수행 할 때까지 손상되지 않습니다. 그 외에도 원격 로그는 누군가가 실수로 로컬 로그를 삭제하거나 실수로 인한 비난으로부터 자신을 보호 할 때 도움이됩니다.
Jenny D

2

sudo su -에있을 것입니다 ~/.bash_history쉘은 bash는 경우.

echo 1234567zz에있을 것입니다 /root/.bash_history루트의 쉘이 bash는 경우.

이것에 대한 설명은 이미 goldilocks에 의해 게시되었습니다.


2

보안 결함이라고 생각하기 때문에 su를 로그하고 싶습니까? 이 명령에 대해 생각해 보셨습니까? sudo bash나쁜 imho처럼.

사람들이 sudo로 할 수있는 일이 걱정된다면 사용을 제한해야합니다. 실행할 수있는 명령을 제한 할 수 있습니다. 걱정되는 경우 / bin / su에 대한 액세스를 제한하십시오.


1

이건 어때?

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log'
sudo -E su
unset PROMPT_COMMAND

또는

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' 
sudo -E su --preserve-environment -
unset PROMPT_COMMAND

또는 긴 원 라이너 :

HISTTIMEFORMAT="%d/%m/%y %T " PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' sudo -E su

sudo -E는 각 프롬프트 전에 PROMPT_COMMAND 환경이 실행되는 환경을 보존합니다.


첫 번째 콘솔은 나에게 콘솔을 제공하지 않으며 두 번째 콘솔을 /root/.bashrc에 넣으면 "sudo su-"후에 루트 콘솔을 얻으려면 CTRL + C를 눌러야합니다. 이 문제를 해결하려면 (또는 "날짜"기능을 추가 하시겠습니까?). 많은 감사합니다!
newuser999

나는 당신이 그것을 잘못 사용하는 것을 두려워합니다. 보다 명확하게 편집했습니다.
Costa

1

이것이 도움이된다면 sudoers의 "NOEXEC"옵션을 사용할 수 있습니다.

이를 다음과 같이 정의해야합니다.

USER_NAME         ALL=(ALL) NOEXEC : ALL

이것은 쉘 이스케이프를 방지하고 사용자는 sudo -i 또는 sudo -s 또는 sudo su-를 사용할 수 없습니다-

그러나 단점이 있지만 모든 쉘 이스케이프는 비활성화됩니다. 스크립트 내에서 스크립트를 실행하는 것도 거부됩니다.


0

이것을 복잡하게 만들지 마십시오 : sudo호출 될 때마다 파일의 일부 파일 에이 사실을보고 /var/log합니다 (시스템의 경우 auth.log내 OS X 상자에 있습니다 system.log). sudo명령 줄 인수를보고하지만와 같은 대화 형 명령 내에서 발생할 수있는 작업에 대한 정보는 없습니다 su.

이것은 루트 서브 쉘에서 일어난 일에 대한 기록이 없다는 것을 의미하지는 않습니다 : 쉘 명령은 쉘의 히스토리에 저장됩니다. 내 시스템에서 root의 기록 저장은 기본적으로 활성화되어 있으므로 수행해야 할 작업에 ~root/.sh_history대한 기록을 찾는 것입니다 (물론 누군가가 변조하지 않은 경우가 아니라면 동일하게 변조 할 수는 없음 /var/log).

나는 생각 이 당신을 위해 최상의 솔루션입니다. 그렇지 않다면 auditd@Jenny가 제안한대로 로 마을로 가십시오 .

추신. 루트 히스토리가 아직 사용 가능하지 않은 경우 사용 가능한 쉘에 따라 사용 가능하게됩니다. 들어 bash설정 HISTORY하고 HISTFILESIZE충분히 큰 수에 (기본값은 500입니다, 내 설명서를 말한다). 원하는 경우 HISTFILE경로 를 설정하여 기록이 저장되는 위치를 지정할 수 있습니다 (기본값 $HOME/.sh_history)


0

다음을 사용하여 세션의 유형 스크립트를 만들 수 있습니다 script(1).

$ sudo su -
# script -t /tmp/my_typescript 2> /tmp/my_typescript.timing
Script started, file is /tmp/my_typescript
# echo foobar
foobar
# echo hello world
hello world
# exit
exit
Script done, file is /tmp/my_typescript

지금 당신은 할 수 있습니다 grep(주는 것을 #프롬프트가 실제로 기록됩니다 /tmp/my_typescript)

$ grep echo /tmp/my_typescript
# echo foobar
# echo hello world

또는 다음을 사용하여 전체 세션을 다시 볼 수도 있습니다 scriptreplay(1).

$ scriptreplay -t /tmp/my_typescript.timing /tmp/my_typescript

파일 /tmp/my_typescript.timing에는 각 명령이 호출 될 때 정보가 포함됩니다. 더 많은 종과 휘파람이 ttyrec있거나 더 많은 도구가 있습니다 shelr.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.