[RedHat] sftp서버 로그 저장
기본적으로 SFTP 서버는 사용자 활동에 대한 로그를 기록하지 않습니다. 그러나 파일 송수신 중 문제를 해결하거나, 보안 정책상 사용자 기록을 추적해야 할 경우 로그 활성화가 필요합니다. 로그 활성화 방법은 아주 간단하며 레드햇 리눅스의 SSHD데몬에 포함된 기능중 하나인 sftp의 로그 설정 방법에 대해 알아봅니다.
환경
Red Hat Enterprise Linux 8
Red Hat Enterprise Linux 9
기본 로그 설정: /var/log/messages에 기록하기
SFTP 로그를 남기기 위해서는 /etc/ssh/sshd_config
파일 내 Subsystem 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 <로그 레벨>: INFO 수준의 로그를 남김. 그 외 옵션으로는 QUIET, ERROR, DEBUG 등이 있으며, 로그 양에 따라 조절 가능합니다.
- -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.
설정이 끝났으면 다음 명령으로 SSHD 데몬을 재시작합니다.
[root@rhel8 ~]# systemctl restart sshd
SFTP 로그 생성 확인
설정 이후 실제 로그가 기록되는지 확인하려면 SFTP 접속을 시도해보면 됩니다. 예를 들어 로컬호스트에 접속하여 디렉토리 목록만 조회해도 로그가 생성됩니다.
[root@rhel8 ~]# sftp localhost root@localhost's password: Connected to localhost. sftp> ls
INFO 레벨로 설정했기 때문에 접속, 디렉토리 열기/닫기 등 모든 기본 활동이 /var/log/messages
에 기록됩니다. 로그 사용량이 많거나 로그 파일 크기 증가가 우려된다면, 로그 레벨을 ERROR
로 낮추는 것도 고려할 수 있습니다.
[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의 번호는 분리 목적이므로 사용하지 않는다면 다른 번호를 입력해도 된다.
먼저, sshd_config
에서 로그 채널을 LOCAL3
로 지정합니다.
Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO -f LOCAL3
2. rsyslog 의 RULE 설정
채널이 local3인 로그는 /var/log/sftp.log파일에 로그를 기록하도록 설정하고 “&~” 규칙을 바로 아래 추가해 처리한 규칙을 더 이상 다른 규칙에 의해 처리되지 않도록 설정한다.
/etc/rsyslog.conf
에 다음 라인을 추가합니다.
[root@rhel8 ~]# vim /etc/rsyslog.conf
...
local3.* /var/log/sftp.log
&~
*.info;mail.none;authpriv.none;cron.none /var/log/messages
...
- &~: 앞에서 처리된 로그 항목을 더 이상 다른 규칙에서 중복 처리하지 않도록 방지
- 이 설정은 반드시 *.info 라인보다 위에 있어야 우선 적용됩니다.
3. 서비스 재시작
sshd_config
와 rsyslog.conf
설정을 모두 마쳤다면 다음 단계는 두 데몬을 재시작하여 변경 사항을 반영하는 것입니다.
[root@rhel8 ~]# systemctl restart sshd [root@rhel8 ~]# systemctl restart rsyslog
/var/log/sftp.log
파일에만 기록되고, 기존 /var/log/messages
파일에는 중복 저장되지 않습니다. 로그 확인은 다음 명령으로 수행할 수 있습니다.4. 로그 로테이션 설정
신규 로그 파일인 /var/log/sftp.log
에는 기본적으로 로그 로테이션이 설정되어 있지 않으므로 수동으로 등록이 필요합니다. 시스템에 따라 편집해야 할 설정 파일은 다음과 같습니다:
-
RHEL 8:
/etc/logrotate.d/syslog
-
RHEL 9:
/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은 systemd 타이머 유닛을 통해 주기적으로 logrotate.service
가 실행되어 파일 순환을 수행합니다.
댓글
댓글 쓰기