프로덕션 서버에서 관리자가 실행 한 모든 명령 기록


70

관리자가 개인 사용자 이름을 통해 서버에 로그인 한 다음 sudo -i루트가 되도록 실행 하는 것이 회사 정책입니다 . 를 실행 sudo -i하면 sudo는 SUDO_USER원래 사용자의 사용자 이름을 포함 하는 환경 변수를이라고 합니다.

다음 구문과 비슷한 방식으로 syslog 내의 모든 명령 을 기록하는 방법이 있습니까?

${TIME/DATE STAMP}: [${REAL_USER}|${SUDO_USER}]: ${CMD}

예제 항목은 다음과 같습니다.

Sat Jan 19 22:28:46 CST 2013: [root|ksoviero]: yum install random-pkg

분명히 정확히 위의 구문 일 필요는 없으며, 최소한의 실제 사용자 (예 : root), sudo 사용자 (예 : ksoviero) 및 실행 된 전체 명령 (예 : yum) 만 포함하면됩니다. 무작위 pkg 설치).

이미 시도 snoopy했지만 SUDO_USER변수가 포함되지 않았습니다 .


13
당신은 필요합니다 auditd.
Michael Hampton

1
이것은 감사에
Deer Hunter

1
누군가가 이것을 답변으로 게시 할 수 있습니까? 사용자가 실행 한 모든 명령을 엄격하게 기록하는 방법을 포함하십시오. "감사에 대한 간략한 소개"는 유용했지만 실제 명령을 기록하는 것과 관련된 내용은 포함하지 않았습니다 (어쨌든 말할 수있는 한).
Soviero

1
좋아, 나는 게임을 시작했으며 auditd실행중인 모든 명령을 기록하는 동안 SUDO_USER변수 (또는 동등한 정보)를 포함하지 않으며 그것을 포함시킬 방법을 찾을 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다!
Soviero

1
그리고 회사 관리자가 입력 한 모든 명령에 대한이 기록으로 무엇을 할 것 입니까?
ewwhite

답변:


82

업데이트 : 의견과 후속 질문에 나타난 두 가지 더 :

  • auditd이 방법을 사용 하면 특히 시스템이 명령 줄을 통해 많이 사용되는 경우 로그 볼륨이 크게 증가합니다. 로그 보존 정책을 조정하십시오.
  • Auditd생성 된 호스트의 로그는 동일한 상자에있는 다른 파일과 마찬가지로 안전합니다. 로그의 무결성을 유지하려면 ELK 또는 Graylog와 같은 원격 로그 수집 서버로 로그를 전달하십시오. 또한 위의 지점에 추가하면 오래된 로그를보다 적극적으로 삭제할 수 있습니다.

Michael Hampton이 제안한대로 auditd여기에 해당 작업에 적합한 도구가 있습니다.

우분투 12.10 설치에서 이것을 테스트 했으므로 마일리지는 다른 시스템에 따라 다를 수 있습니다.

  • 설치 auditd:

    apt-get install auditd

  • 이 두 줄을 다음에 추가하십시오 /etc/audit/audit.rules.

    -a 종료, 항상 -F arch = b64 -F euid = 0 -S execve
    -a 종료, 항상 -F arch = b32 -F euid = 0 -S execve

루트 ( euid=0)로 실행되는 모든 명령을 추적합니다 . 왜 두 규칙? execve콜은 32 비트 및 64 비트 코드에서 추적해야합니다.

  • auid=4294967295로그에서 메시지를 제거하려면 audit=1커널의 cmdline에 추가하십시오 (편집하여 /etc/default/grub)

  • 라인을 배치

    session required pam_loginuid.so

(로그인 할 관련된 모든 PAM 설정 파일에서 /etc/pam.d/{login,kdm,sshd}),하지만 관련이있는 파일 su이나 sudo. 이 수 auditd호출 사용자를 얻기 위해 uid호출 할 때 제대로 sudosu.

  • 지금 시스템을 다시 시작하십시오.

  • 로그인하고 몇 가지 명령을 실행 해 봅시다 :

    $ id -u
    1000
    $ sudo ls /
    빈 부팅 데이터 개발 등 홈 initrd.img initrd.img.old lib lib32 lib64 lost + found media
    $ sudo su-
    # ls / etc
    [...]

이것은 다음과 같은 것을 얻을 것입니다 /var/log/audit/auditd.log:

----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.239:576): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.239:576): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.239:576):  cwd="/home/user"
type=EXECVE msg=audit(1359968226.239:576): argc=2 a0="ls" a1="/"
type=SYSCALL msg=audit(1359968226.239:576): arch=c000003e syscall=59 success=yes exit=0 a0=10cfc48 a1=10d07c8 a2=10d5750 a3=7fff2eb2d1f0 items=2 ppid=26569 pid=26570 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)
----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.231:575): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.231:575): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.231:575):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968226.231:575): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968226.231:575): argc=3 a0="sudo" a1="ls" a2="/"
type=SYSCALL msg=audit(1359968226.231:575): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26569 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.523:578): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.523:578): item=0 name="/bin/su" inode=44 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.523:578):  cwd="/home/user"
type=EXECVE msg=audit(1359968229.523:578): argc=2 a0="su" a1="-"
type=SYSCALL msg=audit(1359968229.523:578): arch=c000003e syscall=59 success=yes exit=0 a0=1ceec48 a1=1cef7c8 a2=1cf4750 a3=7fff083bd920 items=2 ppid=26611 pid=26612 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="su" exe="/bin/su" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.519:577): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.519:577): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.519:577):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968229.519:577): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968229.519:577): argc=3 a0="sudo" a1="su" a2="-"
type=SYSCALL msg=audit(1359968229.519:577): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26611 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.543:585): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.543:585): item=0 name="/bin/bash" inode=6941 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.543:585):  cwd="/root"
type=EXECVE msg=audit(1359968229.543:585): argc=1 a0="-su"
type=SYSCALL msg=audit(1359968229.543:585): arch=c000003e syscall=59 success=yes exit=0 a0=13695a0 a1=7fffce08a3e0 a2=135a030 a3=7fffce08c200 items=2 ppid=26612 pid=26622 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/bin/bash" key=(null)
----
time->Mon Feb  4 09:57:11 2013
type=PATH msg=audit(1359968231.663:594): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968231.663:594): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968231.663:594):  cwd="/root"
type=EXECVE msg=audit(1359968231.663:594): argc=3 a0="ls" a1="--color=auto" a2="/etc"
type=SYSCALL msg=audit(1359968231.663:594): arch=c000003e syscall=59 success=yes exit=0 a0=7fff8c709950 a1=7f91a12149d8 a2=1194c50 a3=7fff8c709510 items=2 ppid=26622 pid=26661 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)

auid열에는 발신 사용자가 포함되어 있으며이 사용자가 uid실행하는 명령을 필터링 할 수 있습니다.

 ausearch -ua 1000

여기에는 사용자가 루트로 실행 한 명령도 나열됩니다.

출처 :


+50이 답변은 가장 포괄적 인 것처럼 보이지만 다소 복잡 해져서 약간 실망했습니다. 당신의 기여에 감사합니다.
grassroot

이러한 변경으로 인해 로그 볼륨이 /var/log/audit/audit.log로 크게 증가 할 수 있습니다. audit.rules에 두 개의 행을 추가 한 후이 파일의 로그 볼륨이 두 배 이상 증가했습니다.
JDS

10

sudo 자체는 syslog에 모든 sudo 명령을 기록하므로 모든 개인 사용자는 단순히 sudo가 아닌 루트 쉘을 얻기 위해 교육을 받아야합니다.

sudo command p1 p2 ... pn

내가 생각한이 접근 방법의 문제점은 root사용자 로서 사용자가 특정 유형의 로깅을 피하는 것이 매우 어렵다는 것입니다. 따라서 당신이 시도하는 것은 100 % 미만이 될 것입니다. 미안합니다.

교육, 문서화, 집행 및 무엇보다도 신뢰가 필요합니다.


3
나는 완벽한 것이 없다는 것을 이해하지만, 우리가 당신이 묘사 한 것처럼 모든 사람이 일하게 할 수는 없습니다. 이들은 우리가 이야기하고있는 sysadmin들입니다;)
Soviero

3
사실은 아닙니다. ... 개인적으로 다수의 시스템 관리자로 구성된 대기업 두 명 이상이이 정책을 시행하고 있습니다! 다시 한 번 교육과 시행으로 작동합니다.
mdpc

2
mdpc가 100 % 정확합니다. 이것이 바로 sudo 명령의 목적입니다. 나는 수백 개의 호스트가있는 10 명의 sysadmins 상점에 있으며 모든 것에 개별 sudo 명령을 사용합니다-su를 통해 루트가되는 것을 금지하는 특정 정책이 있습니다. 관리자 작업을 올바르게 감사 할 수있는 유일한 방법입니다.
Jeff Albert

4
-1 교육은 절대하지 않을 것입니다. 우리는 귀하가 시스템 관리자의 많은 고객 중 한 명인 아웃소싱 된 세계에 살고 있습니다.
grassroot

6

나는 한 번 같은 문제에 직면했고 빠르고 더러운 솔루션을 생각해 내야했다. 명령을 실행하면 각 sudo 사용자는 자신의 히스토리 파일을 갖게된다 sudo -i

에서 /root/.bashrc나는 다음과 같은 라인을 추가 -

 export HISTFILE=/root/.bash_history-$SUDO_USER
 export HISTTIMEFORMAT="%F %T "

따라서 루트 권한을 가진 모든 사용자는 히스토리 파일 .bash_history-username을 갖게됩니다.

다른 방법-

다음 코드를 /root/.bashrc추가하면 사용자 이름, sudo-user 및 명령이 로그 파일에 추가됩니다. 통지 레벨이 설정되어있는 곳이면 / var / log / messages 일 가능성이 높습니다.

function log2syslog
{
   declare COMMAND
   COMMAND=$(fc -ln -0)
   logger -p local1.notice -t bash -i -- "${USER}:${SUDO_USER}:${COMMAND}"
}
trap log2syslog DEBUG

신용 -http : //backdrift.org/logging-bash-history-to-syslog-using-traps


요청한 것은 아니지만 멋진 접근 방식입니다. 감사 또는 유사한 솔루션을보고 싶습니다.
grassroot

알았어 트랩 방법에 의존하도록 업데이트했습니다.
다니엘 t.

3
그리고 합법적 인 사용자에게는 이것이 효과가 있습니다. 그러나 해당 계정이 크랙 된 경우 크래커는 /bin/sh, unset HISTFILE또는 을 실행하여 bash 기록을 빠르게 비활성화 할 수 있습니다 /bin/bash --norc.
Stefan Lasiewski

3

많은 시설에서 자원 사용이 많고 서비스 거부 공격이 발생할 수 있으므로 감사 사용을 실제로 금지하고 있습니다.

한 가지 해결책은 최신 Korn 셸 (ksh-93, 자세한 내용은 http://kornshell.com/ 참조)을 구성하여 루트로 실행 된 모든 명령을 원격 syslog 서버에 기록한 다음 비상시를 제외하고 정책에 따라 요구하는 것입니다. 상황이 발생하면 sysadmins는 개인 계정으로 로그온하고 sudo를 통해 향상된 Korn 셸을 실행합니다. 로그를 검사하면 관리자가 승인 된 셸에서 다른 셸을 시작하여 해당 트랙을 처리 할 수있는시기를 감지 한 다음 SA를 필요한대로 교육 할 수 있습니다.


3

Sudo는 활성화 된 세션이 기록 될 때 sudoreplay 라는 이름을 가지며 나중에 재생할 수 있으며, script터미널 세션의 유형 스크립트를 작성하여 나중에 scriptreplay명령 으로 재생할 수있는 명령 과 유사하게 작동합니다 .


2

버전 2.0.0부터 snoopy 는 임의의 환경 변수를 기록 할 수 있습니다.

그러나 최근의 기여에 따르면 tty의 로깅 소유자는 "누가 그 명령을 루트로 실행 했습니까?"

공개 : 나는 스누피 관리자입니다.


간단한 링크가 아니라 OP의 요구 사항에 따라 설정하는 방법에 대한 지침을 제공하십시오. 감사.
Andrea Lazzarotto

1
-1. 이것은 스누피를위한 플러그 일뿐입니다. 귀하는 공개를 따랐지만 여전히 게시물의 질문에 대답하지 않았습니다. 방금 프로젝트에 연결했습니다.
던컨 X 심슨

1

지금까지 다른 답변에 문제가있는 것은 아니지만 sudo로깅을 통해 syslog만족스러운 것으로 판단되면 주름을 제안 할 수 있습니다. 네트워크를 통해 원격 감사 호스트에 로깅하십시오.

그것은 "지금은 뿌리가되었습니다. 통나무에서 내 불쾌한 흔적을 제거 할 수 있습니다"라는 문제를 해결했습니다. 이제 로컬 상자에서 루트 일 수 있지만 네트워크에서 해당 로그 패킷을 다시 호출 할 수 없으며 원격 감사 호스트에 대한 루트 권한이 없을 것입니다.

몇 년 동안 내가 관리하는 일부 네트워크에서이 작업을 수행했으며 다른 두 가지 신호 이점이 있습니다.

첫째, 네트워크에 모든 syslog를 검사 할 수있는 한 곳이 있으며, 이는 사건을 훨씬 쉽게 연관시킬 수 있으며, " junoNFS 서버 hera가 응답하지 않는다고 불평 할 때 다른 사람이 만약 그렇다면, hera문제가 될 가능성이 있다면, 그녀가 무엇을 기록했는지 보자. 만약 그렇지 않다면, juno"네트워크 연결이 더 의심 스럽다면, juno그 당시에 기록 된 것을 보자 ".

둘째, syslog 로그 순환이 쉬워집니다. 며칠 이상 로컬 호스트에 로그 사본을 보관하지 않지만 감사 서버에 많은 양의 디스크 공간이 있는지 확인하고 모든 syslog를 몇 년 동안 보관하십시오. 예를 들어 법 의학적 감사 목적으로 WORM 미디어에 파일을 쓰려면 WORM 드라이브를 하나만 구입하면됩니다.

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