방금 루트가 아닌 사용자 로거로 플레이했지만 모든 사람이 "-t" 매개변수를 사용하여 syslog에 가짜 항목을 만들 수 있는 것처럼 보입니다.

이것이 이런 식으로 작동할 것으로 예상됩니까? 나는 로그를 범람하거나 다양한 가짜 항목 아래에 일부 작업을 숨길 수 있습니다. 시스템 보안에 좋지 않습니다.

막을 수 있습니까? => 로거는 util-linux-systemd(이전의 util-linux) 패키지의 일부이며 쉽게 제거할 수 없습니다. 둘째, 기본적으로 시스템의 모든 사람이 실행할 수 있습니다.

사용 시스템: 다른 SuSE Linux(SLE 10, 11, 15)

명령줄:

[email protected]:~ > logger -t sshd[986]: Accepted publickey from 127.0.0.19.8 port 65537 sha2: RSA 2e:45:25:54:6o:34:3a:z3:55:07:04 (just a fake)"
[email protected]:~ > su -l
Password:
[email protected]:~ > tail -n 2 /var/log/messages
Oct 27 13:35:45 garfield sshd[986]: Accepted publickey from 127.0.0.19.8 port 65537 sha2: RSA 2e:45:25:54:6o:34:3a:z3:55:07:04 (just a fake)
Oct 27 13:36:21 garfield su: (to root) justin on /dev/pts/0

참고: 나는 가짜 항목임을 분명히 하기 위해 불가능한 값(IP, 공개 키)을 사용했습니다.

answer

이런 식으로 작동할 것으로 예상되며 때로는 스크립트에서 로그 메시지를 게시하는 것이 매우 유용합니다. 확실히 사용자가 시스템 로그를 오염시키려는 의도는 아니었습니다. 내 생각에 솔루션은 사용자가 로그를 오염시키거나 시스템 메시지를 위조하는 것을 방지하여 그렇게 하는 습관이 있는 사용자를 식별할 수 있도록 잘 구성된 로깅 시스템을 갖는 것입니다.

를 사용 rsyslogd하므로 예를 들어 사용하고 있습니다.

우선, rsyslogd열리는 소켓에서 특정 변수를 저장 하도록 구성해야 합니다 .

module (load="imuxsock"
    SysSock.Annotate="on"
    SysSock.ParseTrusted="on"
)

이를 통해 다음 변수에 액세스할 수 있습니다.

  • pid: 로깅 프로세스의 PID입니다.
  • uidgid: 로깅 프로세스가 실행되는 UID 및 GID.
  • appname: 로깅 프로세스의 이름
  • cmd: 로깅 프로세스의 전체 명령줄

의 경우 logger, pid의 PID 될 것입니다 systemd-journald, 그리고 appname항상있을 것입니다 systemd-journal. 이를 통해 다음과 같은 몇 가지 작업을 수행할 수 있습니다.

단순히 이것들을 기록

이러한 변수가 포함된 템플릿을 사용하면 메시지와 획득한 매개변수 사이에 불일치가 있는지 확인할 수 있습니다. 템플릿에서 와 같은 변수에 액세스할 수 있습니다 %$!pid%. 예를 들어 다음과 같은 템플릿을 사용합니다.

$template SomeLogFormat,"%TIMESTAMP:::date-rfc3339% <%pri-text%> %syslogtag%%msg% (logged by pid=%$!pid% running as %$!uid%)\n"

daemon.* /var/log/daemon.log;SomeLogFormat

다음 항목이 생성됩니다.

2021-10-27T18:27:54.638759+02:00 <daemon.info> sshd[986]: Accepted publickey from 127.0.0.19.8 port 65537 sha2: RSA 2e:45:25:54:6o:34:3a:z3:55:07:04 (just a fake) (logged by pid=540 running as 1000)

이를 통해 메시지가 합법적인지 확인할 수 있으며 그렇지 않은 경우 재미있는 분위기에 있는 사용자의 UID를 얻을 수 있습니다. 매개변수를 하나씩 제공하는 대신 %$!%위의 값을 JSON 형식으로 기록하는 템플릿을 사용할 수 있습니다 .

사용자 로그 경로 변경

사용자가 작성한 로그를 별도의 파일에 저장할 수 있습니다(사용자가 루트 파일 시스템을 채울 수 없도록 별도의 파일 시스템에 저장). 다음 구성을 사용하여 사용자의 모든 로그를 다시 라우팅할 수 있습니다.

if $!uid > 999 then /opt/log/user.log;SomeLogFormat
& stop

템플릿( ;SomeLogFormat부분)의 사용은 선택 사항입니다. 이렇게 하면 UID가 1000+ 이상인 모든 항목이 /opt/log/user.log. 다음과 같이 UID로 사용자 로그를 분리할 수도 있습니다.

$template userLogFile,"/opt/log/userlog_%$!uid%.log"

if $!uid > 999 then ?userLogFile;SomeLogFormat
& stop

이렇게 하면 모든 사용자가 자신의 userlog_xxxx.log파일 을 갖게 됩니다.