나는 시스템의 기본 시스템 관리자입니다. 시스템에는 루트 권한을 가진 3명의 sudoer 사용자가 있습니다.
시스템은 가능한 악의적인 변경 사항을 감지하기 위해 시스템 유틸리티의 해시를 확인하는 스크립트를 백그라운드에서 실행합니다. 오늘 저는 ssh
이 유틸리티의 해시가 변경되었다는 알림을 받았습니다 .
지금까지 업데이트가 없었고 sudoer 중 한 명이 이에 대한 책임이 있다고 생각합니다. 어떤 sudoer가 ssh
유틸리티를 변경했는지 감지할 수 있습니까 ?
답변1
나는 RHEL을 사용하여 답변을 작성할 예정이지만 SuSE 또는 Debian 기반 배포판을 사용하는 경우 내가 설명한 것과 비슷한 내용을 갖게 될 것입니다.
먼저, 그것이 시스템 업데이트이고 누군가가 귀하의 컴퓨터를 루트킷하려는 것이 아닌지 확인하려는 경우 openssh-clients
다음과 같이 패키지를 "확인"할 수 있습니다.
[root@hypervisor scsd]# rpm -V openssh-clients
[root@hypervisor scsd]#
[root@hypervisor scsd]# rpm -V openssh-server
S.5....T. c /etc/pam.d/sshd
S.5....T. c /etc/ssh/sshd_config
[root@hypervisor scsd]#
나는 openssh-server
상황이 변할 때 어떻게 보이는지 볼 수 있도록 이렇게 했습니다. 중요한 부분은 "5"입니다. 이는 파일의 md5sum이 RPM 데이터베이스에 존재하는 것과 다르다는 것을 알려줍니다. 체크아웃되면 시스템 업데이트로 인한 것일 수 있습니다.
yum을 사용하는 경우(아마도) 업데이트되는 RPM에 대한 /var/log/yum.log 항목이 있을 것입니다. 이는 나중에 보기 위해 업데이트가 발생한 특정 시간을 얻는 데 유용합니다 yum history
.
직접 사용 하면 마술을 부리거나 발생한 날짜를 알 rpm
수 있습니다 (이 정보를 이미 알고 있는 것처럼 들리겠지만).queryformat
rpm -q openssh-clients --last
호출 사용자의 auid/loginuid를 기록하는 yum
하위 명령이 있습니다 .history
[root@hypervisor scsd]# yum history
Loaded plugins: product-id, refresh-packagekit, rhnplugin, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
This system is receiving updates from RHN Classic or RHN Satellite.
ID | Login user | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
54 | <jadavis6> | 2013-07-15 09:03 | Install | 2
53 | <jadavis6> | 2013-07-09 17:25 | Update | 23
52 | <jadavis6> | 2013-06-24 10:10 | Install | 3 <
51 | <jadavis6> | 2013-06-14 22:33 | Install | 1 >
50 | <jadavis6> | 2013-06-14 07:47 | E, I, U | 90
49 | root <root> | 2013-06-14 00:58 | Update | 1
48 | <jadavis6> | 2013-06-03 08:28 | Install | 3
47 | <jadavis6> | 2013-05-28 11:57 | Install | 3 <
46 | <jadavis6> | 2013-05-20 18:25 | Install | 1 >
45 | <jadavis6> | 2013-05-20 12:00 | Install | 1
44 | <jadavis6> | 2013-05-19 15:29 | Install | 6
43 | <jadavis6> | 2013-05-18 20:16 | Install | 3
42 | <jadavis6> | 2013-05-16 16:21 | Install | 2 <
41 | <jadavis6> | 2013-05-16 12:48 | Install | 1 >
40 | <jadavis6> | 2013-05-10 09:28 | Install | 1
39 | <jadavis6> | 2013-05-10 09:28 | Install | 1
38 | <jadavis6> | 2013-04-29 19:45 | Install | 2 <
37 | <jadavis6> | 2013-04-29 18:51 | Install | 8 >
36 | <jadavis6> | 2013-04-29 18:35 | Update | 11
35 | <jadavis6> | 2013-04-27 15:44 | E, I, O, U | 429 EE
history list
[root@hypervisor scsd]#
init의 하위 프로세스가 분리되면 loginuid -1(음수)로 시작하므로 loginuid는 위조할 수 없습니다. tty 또는 pam_loginuid를 통해 로그인할 때 sshd
이를 인증된 사용자의 UID로 설정합니다 (이 작업을 수행하는 다른 모듈도 있습니다).-1
루트 이외의 값 으로 설정되면 이 값을 변경할 수 없습니다.(단, 최신 커널에서만) 비기능/계정 기능만 있고 공격자가 루트 권한을 얻었을 수도 있다는 점을 고려해야 합니다. 모든 하위 프로세스는 상위 프로세스의 loginuid를 상속하므로 sudo
EUID가 0(또는 임의의 사용자)인 프로그램을 생성하더라도 여전히 동일한 loginuid를 갖게 됩니다.
sudo 작업을 실행하여 이를 테스트할 수 있으며, cat /proc/self/loginuid
원래 로그인한 사용자는 이후 호출 횟수에 관계없이 매번 작업을 실행해야 합니다 su
. 루트로 이 모든 작업을 수행했음에도 불구하고 위 의 내용이 알려진 방법 sudo
입니다 .yum history
jadavis6
yum update
두 개의 yum 트랜잭션 사이에 모호성이 있는 경우 yum history info <transID>
마지막 트랜잭션에 대해 더 알고 싶다면 다음을 수행할 수 있습니다.
[root@hypervisor scsd]# yum history info 35
Loaded plugins: product-id, refresh-packagekit, rhnplugin, security,
: subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
This system is receiving updates from RHN Classic or RHN Satellite.
Transaction ID : 35
Begin time : Sat Apr 27 15:44:57 2013
Begin rpmdb : 959:3d300ae2e8dc239f9f972306ba2406bd22ba29bc
End time : 15:50:39 2013 (5 minutes)
End rpmdb : 972:381cb76592ea2f779ee4521a4e7221196520486a
User : <jadavis6>
Return-Code : Success
Command Line : update -y
Transaction performed with:
Updated rpm-4.8.0-27.el6.x86_64 @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3
Updated subscription-manager-0.99.19.4-1.el6_3.x86_64 @rhel-x86_64-server-6
Updated yum-3.2.29-30.el6.noarch @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3
Installed yum-metadata-parser-1.1.2-16.el6.x86_64 @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3
Packages Altered:
Updated NetworkManager-glib-1:0.8.1-34.el6_3.x86_64 @rhel-x86_64-server-6
Update 1:0.8.1-43.el6.x86_64 @rhel-x86_64-server-6
Updated PackageKit-0.5.8-20.el6.x86_64 @rhel-x86_64-server-6
Update 0.5.8-21.el6.x86_64 @rhel-x86_64-server-6
Updated PackageKit-device-rebind-0.5.8-20.el6.x86_64 @rhel-x86_64-server-6
[...snip...]
Updated yum-3.2.29-30.el6.noarch @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3
Update 3.2.29-40.el6.noarch @rhel-x86_64-server-6
Updated yum-rhn-plugin-0.9.1-40.el6.noarch @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3
Update 0.9.1-43.el6.noarch @rhel-x86_64-server-6
Scriptlet output:
1 warning: /etc/shadow created as /etc/shadow.rpmnew
2 No input from event server.
3 warning: %postun(wdaemon-0.17-2.el6.x86_64) scriptlet failed, exit status 1
history info
시스템 업데이트가 다소 길어질 것 같아서 잘랐습니다.
rpm
AFAIK 구성 외부에서 직접 업데이트하여 auditd
RPM 데이터베이스 파일의 변경 사항을 모니터링하는 경우 소급하여 이를 수행할 수 있는 방법이 없습니다. 그러면 ausearch
변경을 수행한 PID 목록과 관련 로그인 ID( 로 표시됨 auid
)를 볼 수 있습니다.
RPM 외부에서 직접 변경하는 경우 변경하기 전에 모니터링하려는 각 파일에서 변경 사항을 모니터링해야 합니다. 실제로 할 수 있는 일은 많지 않지만 auditd
루트킷 대상이라고 생각되는 파일을 모니터링하기 위해 몇 가지 작업을 수행하는 것을 고려할 수 있습니다. 너무 많은 작업을 수행하면 시스템이 중단될 수 있습니다. 악의적인 변조를 방지하려면 서버에서 이러한 로그를 어딘가로 보내야 한다는 점도 언급할 가치가 있습니다.
도움이 되길 바랍니다.
편집하다:
한 가지 주목할 점은 루트처럼 보인다는 것입니다.할 수 있는loginuid가 있는 경우 이를 변경하십시오 CAP_SYS_AUDITCONTROL
(loginuid가 현재인 경우에는 필요하지 않음 -1
). 그러나 시스템 경계 세트에서 해당 기능을 제거할 수 있어야 합니다. 이렇게 하면 공격자가 해당 기능을 얻기 위해 시스템을 재부팅해야 합니다. hell 작업에서는 감사 가능한 이벤트를 모든 곳에 남겨 두므로 그렇게 할 가능성이 줄어듭니다.
답변2
파일 을 보면 파일 변경 시간/날짜를 sudoer 권한을 가진 사용자 3명 중 한 명이 로그인한 시간/날짜와 일치 /var/log/audit/audit.log
할 수 있어야 합니다 .ssh
파일 audit.log
에는 다음과 같은 줄이 포함되어 있습니다.
type=USER_START msg=audit(1374006520.730:480): user pid=28303 uid=0 auid=500 subj=user_u:system_r:unconfined_t:s0 msg='PAM: session open acct="root" : exe="/usr/bin/sudo" (hostname=?, addr=?, terminal=/dev/pts/7 res=success)'
type=CRED_ACQ msg=audit(1374006535.446:488): user pid=28352 uid=0 auid=500 subj=user_u:system_r:unconfined_t:s0 msg='PAM: setcred acct="root" : exe="/usr/bin/sudo" (hostname=?, addr=?, terminal=/dev/pts/7 res=success)'
type=USER_START msg=audit(1374006535.448:489): user pid=28352 uid=0 auid=500 subj=user_u:system_r:unconfined_t:s0 msg='PAM: session open acct="root" : exe="/usr/bin/sudo" (hostname=?, addr=?, terminal=/dev/pts/7 res=success)'
AUID(Affective User ID - sudo
명령을 실행한 사용자라고도 함)로 역추적할 수 있습니다.
AUID 500은 내 시스템에 있는 이 사람입니다.
$ grep 500 /etc/passwd
sam:x:500:500:Sam M.:/home/sam:/bin/bash
이제 audit.log
grep을 사용할 수 있지만 ausearch
이 도구를 사용하면 스캔하는 것이 훨씬 쉽습니다. 우선, 감사 로그의 타임스탬프를 사람이 더 읽기 쉬운 형식으로 인쇄합니다.
$ ausearch -x /usr/bin/sudo
...
time->Thu Jul 18 14:41:48 2013
type=CRED_ACQ msg=audit(1374172908.936:45): user pid=21252 uid=0 auid=500 subj=user_u:system_r:unconfined_t:s0 msg='PAM: setcred acct="root" : exe="/usr/bin/sudo" (hostname=?, addr=?, terminal=/dev/pts/5 res=success)'
----
time->Thu Jul 18 14:41:48 2013
type=USER_START msg=audit(1374172908.937:46): user pid=21252 uid=0 auid=500 subj=user_u:system_r:unconfined_t:s0 msg='PAM: session open acct="root" : exe="/usr/bin/sudo" (hostname=?, addr=?, terminal=/dev/pts/5 res=success)'
-x /usr/bin/sudo
여기에서는 실행 가능한 sudo()가 포함된 일치 항목을 로그 파일에서 검색하고 있습니다 .
답변3
확인해보셨나요 syslog
? 에 따르면 man sudo
sudo는 성공 및 실패 시도(오류 포함)를 syslog(3), 로그 파일 또는 둘 다에 기록할 수 있습니다. 기본적으로 sudo는 syslog(3)를 통해 기록하지만 구성 시 또는 sudoers 파일을 통해 변경할 수 있습니다.
의도적으로 로그 파일을 삭제하지 않는 한 거기에서 정보를 얻을 수 있어야 한다고 생각합니다. 시간 범위를 좁히려면 SSH 유틸리티에서 수정 날짜 스탬프를 확인할 수 있습니다.