데비안 상자가 있는 경우 일부 사용자는 루트 계정에 액세스할 수 있고, 일부 사용자는 SSH 연결을 열고 명령 실행을 시작하고, 일부는 화면을 열거나 byobu 또는 기타 유사한 도구를 사용하여 명령을 실행합니다.
"history" 명령은 실행된 명령의 전체 목록을 가져오지 못하는 것 같습니다.
실행된 모든 명령을 얻는 가장 좋은 방법은 무엇입니까?
답변1
해킹이지만 적어도 작동합니다. root
해당 서버에 다음이 필요합니다 .
출력을 보면 ps aux
사용자의 fork 가 표시됩니다 sshd
. 예를 들어 이 경우 user 는 다음과 같습니다 mst
.
$ ps aux | grep ssh
mst 19325 0.0 0.0 76268 1920 ? S 21:20 0:00 sshd: mst@pts/6
그래서 다음과 같이 이 프로세스의 파일 설명자를 확인합니다.
$ sudo ls -lha /proc/19325/fd
total 0
dr-x------ 2 root root 0 Aug 30 21:26 .
dr-xr-xr-x 7 mst users 0 Aug 30 21:25 ..
lrwx------ 1 root root 64 Aug 30 21:26 0 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 1 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 11 -> /dev/ptmx
lrwx------ 1 root root 64 Aug 30 21:26 12 -> /dev/ptmx
lrwx------ 1 root root 64 Aug 30 21:26 2 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 3 -> socket:[138972]
lrwx------ 1 root root 64 Aug 30 21:26 4 -> socket:[138198]
lrwx------ 1 root root 64 Aug 30 21:26 5 -> socket:[138200]
lrwx------ 1 root root 64 Aug 30 21:26 6 -> socket:[138207]
lr-x------ 1 root root 64 Aug 30 21:26 7 -> pipe:[138212]
l-wx------ 1 root root 64 Aug 30 21:26 8 -> pipe:[138212]
lrwx------ 1 root root 64 Aug 30 21:26 9 -> /dev/ptmx
세 개의 링크는 , /dev/ptmx
및 을(를) 가리킵니다. 사용자의 쉘은 그가 입력한 모든 명령과 그 명령의 출력을 인쇄하기 때문에 나는 fd 번호에 대한 시스템 호출을 사용하고 필터링하여 그의 명령을 관찰합니다(두 번째 링크도 마찬가지임).stdin
stdout
stderr
stdout
strace
read
11
11
/dev/ptmx
sudo strace -e read -s 256 -p 19325 2>&1 | grep 'read(11'
사용자가 다음 명령을 입력한 것을 볼 수 있습니다 ls
.
read(11, "l", 16384) = 1
read(11, "s", 16384) = 1
좋아, 출력이 좋지는 않지만...작동합니다
답변2
가장 좋은 방법은 auditd를 사용하는 것입니다. 특정 사용자가 실행한 모든 명령, 모든 사용자가 실행한 모든 명령, 특정 명령의 호출 등을 기록하도록 설정할 수 있습니다.
매뉴얼 페이지에서는 auditctl
필요할 수 있는 규칙의 몇 가지 예를 제공합니다. 또한, 다른 루트 사용자를 신뢰하지 못한다면 다른 사람이 접근할 수 없는 별도의 서버에 로그인하는 것이 좋습니다.
또한 루트 비밀번호를 제공하지 말고 루트로 SSH 로그인을 허용하지 않는 것이 좋습니다. 대신, 로그인한 사용자에게만 자신의 계정을 허용하고 루트로 만드세요 sudo su
. 또한 auditd는 어떤 사용자가 무엇을 했는지 추적할 수 있습니다.