[RedHat] sftp서버 로그 저장

sftp 서버는 기본적으로 활동 로그를 기록하지 않습니다. 다만 뭔가 파일 송수신에 문제가 있어 트러블슈팅을 하거나 정책에 의해 로그를 기록해야 하는 경우에는 따로 로그를 활성화시켜줘야 합니다. 로그 활성화 방법은 아주 간단하며 레드햇 리눅스의 SSHD데몬에 포함된 기능중 하나인 sftp의 로그 설정 방법에 대해 알아봅니다.

 

환경

Red Hat Enterprise Linux 8

Red Hat Enterprise Linux 9

/var/log/messgeas 에 sftp 로그 설정

/etc/ssh/sshd_config 설정 파일을 열어보면 “Subsystem sftp”로 시작하는 sftp 설정 라인이 있는데 해당 라인 끝에 로그 레벨만 설정해 주면 /var/log/messages에 로그가 기록된다.

1. sftp 로그 레벨 설정

[root@rhel8 ~]# vim /etc/ssh/sshd_config
...
# override default of no subsystems
# Subsystem       sftp    /usr/libexec/openssh/sftp-server       --> 기존 설정 주석 처리
Subsystem       sftp    /usr/libexec/openssh/sftp-server -l INFO
...
  • -l <로그 레벨>: possible values are: QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3
  • -f <로그 채널(facility)>: possible values are: DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7

옵션에 관한 자세한 내용은 man 페이지를 참조할 수 있다.

[root@rhel8 ~]# man sftp-server
...
     -f log_facility
             Specifies the facility code that is used when logging messages from sftp-server.  The possible
             values are: DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7.
             The default is AUTH.

     -h      Displays sftp-server usage information.

     -l log_level
             Specifies which messages will be logged by sftp-server.  The possible values are: QUIET, FATAL,
             ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3.  INFO and VERBOSE log transactions that
             sftp-server performs on behalf of the client.  DEBUG and DEBUG1 are equivalent.  DEBUG2 and
             DEBUG3 each specify higher levels of debugging output.  The default is ERROR.

2. sshd 데몬 재시작

[root@rhel8 ~]# systemctl restart sshd

3. 로그 발생을 위한 sftp 접속 테스트 및 로그 확인

sftp 로그가 잘 저장되는지 테스트하는 경우 아래처럼 localhost로 접속해서 파일만 조회해도 로그가 생성되는 걸 볼 수 있다. 로그 레벨을 INFO로 했기 때문에 INFO 성 모든 로그가 기록되는데 sftp 사용이 많은 경우 많은 로그가 발생할 수 있는데 그럴 땐 ERROR로 로그 레벨을 올려서 사용하는 것도 고려해 볼 수 있다.

[root@rhel8 ~]# sftp localhost
root@localhost's password:
Connected to localhost.
sftp> ls

여기까지 완료하면 /var/log/message에서 sftp를 사용할 때마다 로그가 기록되는 걸 확인할 수 있다.

[root@rhel8 ~]# vi /var/log/messages
...
Jun 10 14:47:51 rhel8 sftp-server[711037]: session opened for local user root from [::1]
Jun 10 14:47:53 rhel8 sftp-server[711037]: opendir "/root"
Jun 10 14:47:53 rhel8 sftp-server[711037]: closedir "/root"
Jun 10 14:48:48 rhel8 sftp-server[711037]: session closed for local user root from [::1]

특정 파일에 sftp 로그 기록 (/var/log/sftp.log)

특정 파일에 로그 기록을 위해서는 저널의 로그를 파일로 이동시키는 rsyslog 파일 설정까지 함께 진행해야 한다. 위에서 로그 레벨만 설정해 주면 로그가 /var/log/messages에 기록이 되었는데 이는 이미 기본적으로 rsyslog가 모든 로그를 /var/log/messages에 기록하도록 설정되어 있기 때문이다.

/etc/rsyslog.conf의 아래 내용에 관련 설정이 있다.

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

모든 채널(facility)의 INFO 이상 등급의 로그는 /var/log/messages 파일에 기록하되 mail, authpriv, cron 채널의 로그는 제외한다는 설정이다.

따라서 특정 파일(/var/log/sftp.log)에 로그를 기록하기 위해 sftp 설정에서 로그 채널을 별도로 분리하고 rsyslog 설정에서 해당 채널의 로그를 /var/log/sftp.log 파일에 기록하게 해주면 된다.

1. sftp 로그 설정

로그 레벨은 INFO로 그리고 로그 채널(facility)은 lcoal3으로 설정하였다. local의 번호는 분리 목적이므로 사용하지 않는다면 다른 번호를 입력해도 된다.

Subsystem       sftp    /usr/libexec/openssh/sftp-server -l INFO -f LOCAL3

2. rsyslog 의 RULE 설정

채널이 local3인 로그는 /var/log/sftp.log파일에 로그를 기록하도록 설정하고 “&~” 규칙을 바로 아래 추가해 처리한 규칙을 더 이상 다른 규칙에 의해 처리되지 않도록 설정한다.

[root@rhel8 ~]# vim /etc/rsyslog.conf
...
local3.*                        /var/log/sftp.log
&~
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
...

위 설정에서 보면 sftp 로그 설정을 /var/log/messages 위에 설정했는데 그 이유가 local3 채널을 먼저 처리한 후 &~설정에 의해 처리된 규칙을 /var/log/messages가 중복으로 기록하는 걸 방지하기 위함이다.

3. 서비스 재시작

sshd와 rsyslog 모두 재시작하여 설정을 적용한다.

[root@rhel8 ~]# systemctl restart sshd
[root@rhel8 ~]# systemctl restart rsyslog

4. 로그 로테이션 설정

messages에 로그를 기록할 때는 로그 로테이션 기능이 작동합니다. 즉 기본 일주일 간격으로 파일을 순환시켜 용량이 커지는 걸 방지하는데 /var/log/sftp.log 파일의 경우는 새로운 파일이므로 등록해 줘야 한다.

레드햇 버전에 따라 설정해야 하는 파일명이 조금 다르다.

<RHEL8> /etc/logrotate.d/syslog

<RHEL9> /etc/logrotate.d/rsyslog

[root@rhel8 ~]# vim /etc/logrotate.d/syslog
/var/log/sftp.log            --> 파일의 가장 위에 해당 라인 추가
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    missingok
    sharedscripts
    postrotate
        /usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true
    endscript
}

로그 로테이션 설정 파일 변경 뒤에는 재시작할 데몬이 없다. RHEL8의 경우 anacron에 의해 로테이션 되고 RHEL9의 경우 타이머 유닛에 의해 logrotate.service가 일정 간격으로 실행되어 로그를 로테이션 시킨다.

참조

https://access.redhat.com/articles/1374633

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top