목차
1. 서버 보안 설정
1-1 서버 로그 확인
1-2 시스템 로그 파일
1-3 systemd-journald
2. FTP
2-1 개요
2-2 FTP - vsftp 설치
2-3 FTP - vsftpd.conf
2-4 FTP - vsftpd.conf 사용자 제한 실습
1. 서버 보안 설정
1-1 서버 로그 확인
● 로그 정보
로그 정보는 시스템 운영 중에 발생하는 사용자, 프로세스 등의 다양한 정보를 제공한다. 이는 시스템의 정상 작동 및 오작동에 대한 정보 등 감사 추적 정보를 포함하여 이슈 발생 시 시스템의 상태 파악 및 책임 추적, 대책 마련 등에 필수적인 정보이다.
- /var/log를 기본 디렉토리로 한다.
- /var 안에는 변경 내용이 함구적으로 보존되는 설정들, /run 안에는 변경 내용이 함구적으로 보존되지 않는 설정들이 저장된다.
- 바이너리 파일도 있으므로 로그를 지우는 경우 > [파일명] 명령어를 이용해 파일을 비운다.
1-2 시스템 로그 파일
● /var/log/messages
- 시스템 전반적인 로그를 저장한다.
- 로그인, 장치 구동, 시스템 설정, 파일 시스템 작동, 네트워크 등 다양한 정보를 저장한다.
- 형식
: [생성 일시] [host 또는 IP] [발생자 또는 원인] [메시지]
● /var/log/secure
- ssh, telnet 등 원격 접속 관련 로그를 저장한다.
- 형식
: [생성일시] [데몬] [접속 이력 및 인증 여부]
● /var/log/utmp
- 현재 로그인 된 사용자에 대한 정보를 저장한다.
- 바이너리 파일이므로: w, who, finger 등의 명령을 이용한다.
- pkill -u [계정명] 명령으로 해당 계정의 접속을 끊을 수 있다.
- root로 root 계정을 죽일 시 터미널 자체가 죽어 서버를 재부팅해야 한다.
● /var/log/wtmp
- 계정의 로그인, 재부팅 등의 로그를 저장한다.
- 바이너리 파일이므로 last 명령을 이용한다.
- 형식
: [유저] [터미널] [IP] [시간] [유저] [시스템 로그] [커널 버전] [시간]
● /var/log/btmp
- 접속 실패 로그를 저장한다.
- 바이너리 파일이므로 lastb 명령을 이용한다.
- 서버 관리자 입장에서 해당 로그는 자주 확인하는 것이 좋다.
- 형식
: [유저] [터미널] [IP] [시간]
● /var/log/lastlog
- 각 계정별 마지막 접속 정보를 저장한다.
- 바이너리 파일이므로 lastlog 명령을 이용한다.
- 형식
: [유저] [터미널] [IP] [최종접속시간]
1-3 systemd-journald
시스템 로그를 중앙 집중적으로 관리하는 systemd 시스템의 핵심 구성 요소로, 시스템, 커널, 서비스, 애플리케이션 등에서 발생한 로그를 수집하고 바이너리 형식으로 저장한다.
- systemctl로 관리되는 서비스의 로그 정보를 제공한다.
- journalctl 명령어를 통해 저장된 로그를 쉽게 조회하고 필터링한다.
● /etc/systemd/journald.conf
/etc/systemd/journald.conf 파일에서 journald에 대한 컨피그레이션이 가능하다.
- Storage=[persistent | volatile | auto]
: 로그 저장 위치 및 방식을 지정한다.
: persistent: /var/log/journal/, volatile: /run/log/journal/
: auto: 로그의 위치가 /var 하위인지 /run 하위인지 확인 후 자동으로 로그의 위치에 저장한다. 보통 /run/log/journal 경로에 위치한다.
- Compress=[yes | no]
: 오래된 로그 파일을 gzip으로 압축할지 여부를 지정한다.
- SystemMaxUse=[500M]/ RuntimeMaxUse=[500M]
: 저장 가능한 로그의 최대 용량을 지정한다.
- SystemKeepFree= / RuntimeKeepFree=
: 디스크에 최소한으로 남겨둘 공간을 지정한다.
- SystemMaxFileSize= / RuntimeMaxFileSize=
: 개별 로그 파일의 최대 크기를 지정한다.
- SystemMaxFiles= / RuntimeMaxFiles=
: 로그 파일 개수를 제한한다.
● journalctl
journalctl 명령을 통해 저널 관련 로그 정보 출력이 가능하다.
-u sshd | 서비스 지정 |
-b | 현재 부팅부터 로그 출력 |
-f | 실시간 로그 출력 |
-r | 최신 로그부터 출력 |
-n 100 | 출력할 최신 로그 N개 지정 |
-o json | json 형식으로 로그 출력 |
-o verbose | 상세한 정보 출력 |
-k | 커널 메시지만 출력 |
--since "2025-04-25 10:00" | 이후 로그 출력 |
--since "1 hour ago" | |
--since today | |
--until "2025-04-25 12:00" | 이전 로그 출력 |
--list-boots | 부팅 기록 출력 |
_UID=0 | UID 지정 |
_PID=1234 | PID 지정 |
journalctl --since "2025-04-24 22:00" --until "2025-04-25 01:00"
journalctl -u sshd -n 50 : sshd 서비스의 최근 50줄 출력
journalctl _UID=0 -n 20 : root 사용자 로그 중 최근 로그
journalctl --list-boots : 부팅 횟수 확인
journalctl -u sshd-f : 실시간 ssh 로그 모니터링
2. FTP
2-1 개요
ftp는 대용량 파일 전송 서비스에 적합한 파일 전송 프로토콜이다.
- 시스템의 리소스를 많이 차지한다.
- 현재 대부분의 서버는 xinetd가 아닌 stand alone 형태로 운영한다.
* xinetd : 서비스가 아니며 리스닝만 수행한다.
* standalone : 직접 메모리로 올라가 스스로 리스닝을 수행한다.
● out of band
리소스를 다중으로 사용하는 경우, 즉 리소스를 많이 사용한다는 표현으로 사용한다.
- ftp로 접속하여 하는 작업들은 21번 포트에서 진행된다.
- get 하는 순간 20번 포트가 추가로 열리며 해당 포트로 작업이 진행된다.(active mode)
* active mode : get 작업 시 서버가 클라이언트에게 접속 신호를 먼저 보낸다.
* passive mode : get 작업 시 클라이언트가 서버에 접속 신호를 보낸다. 이때 임의의 포트(1024번 이후)를 이용함에 따라 방화벽이 허용할 포트의 범위가 넓어지므로 방화벽의 의미가 퇴색된다. active mode 대신 이용할 이유가 전혀 없는 방식이다.
2-2 FTP - vsftp 설치
ftp 서버 프로그램인 vsftp를 설치한다.
● vsftp 설치 확인 및 설치
# dnf list vsftpd
# dnf install -y vsftpd
● vsftp 서버 실행
# systemctl start vsftpd
● 관련 파일
- 데몬
: /usr/sbin/vsftpd
- 설정 파일
: /etc/vsftpd/vsftpd.conf
- PAM 모듈
: 사용자 인증을 처리해주는 인증 모듈이다.
: /etc/pam.d/vsftpd
- 접근 제한 파일
: 해당 파일 안의 사용자 리스트를 기준으로 접근 제한을 적용한다.
: /etc/vsftpd/ftpusers
/etc/vsftpd/user_list
2-3 FTP - vsftpd.conf
● active, passive mode 설정
- 액티브 모드 설정
: pasv_enable=NO(default : YES)
: 패시브 모드를 거부함으로써 액티브 모드를 설정한다.
: 클라이언트에서 패시브 모드로 접속을 요청해도 액티브 모드로 접속된다.
- 패시브 모드 설정
: pasv_enable=YES (default : YES)
: pasv_min_port=0 (default : 0, 모든 포트 이용)
: pasv_max_port=0 (default : 0, 모든 포트 이용)
● 접속 제한 설정
max_clients=30
: 최대 동시 접속 클라이언트 수를 제한한다.
max_per_ip=3 (0은 무제한)
: 한 ip당 최대 동시 접속 클라이언트 수를 제한한다.
: nat 환경 클라이언트가 접속하는 경우 결국 같은 ip로 접속하게 되어 제한이 걸린다.
ls_recurse_enable=YES
: ls -R 명령을 허용할 지 설정한다.
: ls -R 명령은 하위 디렉토리까지 검색하여 부하가 크다.
● 익명 사용자 관련 설정
anonymous_enable=YES
: 익명 사용자의 접근을 허가한다. NO 설정하는 것을 권장한다.
anon_upload_enable=YES (d:NO)
: 익명 사용자의 업로드를 허가한다.
anon_mkdir_write_enable=YES (d:NO)
: 익명 사용자의 디렉토리 생성, 쓰기 작업을 허가한다.
deny_email_enable=YES (d:NO banned_email_file)
: 익명 사용자 접근 시 이메일을 요구하는데, 이때 banned_email_file 파일에 지정된 메일 계정은 접속을 불허한다.
non_anon_password=NO
: 익명이 아닌 사용자는 패스워드 없이 접속 가능하다.
anon_root=/var/ftp (d:/var/ftp)
: 익명 사용자는 /var/ftp 경로를 최상위 경로( / )로 인식한다.
ftp_username=ftp (d:ftp)
: 익명 사용자 접속 시 ftp라는 계정으로 인식된다
2-4 FTP - vsftpd.conf 사용자 제한 실습
● chroot 설정
지정한 대상만 chroot를 적용하는 방식, 지정한 대상을 제외한 모두에게 chroot를 적용하는 방식 총 두 방식이 존재한다.
chroot_local_user와 chroot_list_enable 설정을 조합하여 적용한다.
chroot_list_enable | chroot_list_user | 의미 |
YES | YES | chroot_list_file에 등록된 사용자만 chroot를 적용하지 않는다. |
YES | NO | chroot_list_file에 등록된 사용자만 chroot를 적용한다. |
NO | 무관 | chroot 설정을 적용하지 않는다. |
chroot_list_file=/etc/vsftpd/chroot_list
: chroot_list_file의 경로를 정의한다.
allow_writeable_chroot=YES
: chroot 적용 사용자가 접속하기 위해 반드시 필요한 설정이다.
- chroot 설정은 외부 디렉토리로 연결된 link 디렉토리로의 접근도 금지된다. 이 경우 mount 명령을 이용한다.
# mount --bind [원본 디렉토리] [연결할 디렉토리]
● chroot 설정 실습
- /etc/vsftpd/chroot_list 파일에 계정을 등록한다.
※ chroot_local_user와 chroot_list_enable이 각각 YES/YES 인 경우
- 리스트에 등록됐던 st01은 상위 디렉토리로 접근이 가능하다.
- 리스트에 등록되지 않았던 st02는 상위 디렉토리로 더 이상 접근이 불가하다.
※ chroot_local_user와 chroot_list_enable이 각각 NO/YES 인 경우
- 리스트에 등록됐던 st01은 상위 디렉토리로 더 이상 접근이 불가하다.
- 리스트에 등록되지 않았던 st02는 상위 디렉토리로 접근이 가능하다.
● 사용자 제한 설정(user_list)
지정한 대상만 접근을 제한하는 방식, 지정한 대상을 제외한 모두의 접근을 제한하는 방식 총 두 방식이 존재한다.
userlist_enable과 userlist_deny 설정을 조합하여 적용한다.
userlist_enable | userlist_deny | 의미 |
YES | YES | user_list 파일에 등록된 사용자는 접속이 불가하다. |
YES | NO | user_list 파일에 등록된 사용자만 접속이 가능하다. |
NO | 무관 | user_list를 이용한 사용자 제한을 하지 않는다. |
- userlist_deny의 디폴트는 YES이다.
● 사용자 제한 설정(user_list) 실습
- /etc/vsftpd/user_list 파일에 st01을 추가한다.
※ userlist_enable과 userlist_deny가 각각 YES/YES 인 경우
- 리스트에 등록됐던 st01은 접근이 불가하다.
- 리스트에 등록되지 않았던 st02는 접근이 가능하다.
※ userlist_enable과 userlist_deny가 각각 YES/NO 인 경우
- 리스트에 등록됐던 st01은 접근이 가능하다.
- 리스트에 등록되지 않았던 st02는 접근이 불가하다.
● 사용자 제한 설정(ftpusers)
PAM(Pluggable Authentication Module) 모듈에 의한 접속 제어로, userlist 방식과 유사하다.
/etc/pam.d/vsftpd 파일에 접속 제한 방식을 설정하며 /etc/vsftpd/ftpusers 파일에 계정을 등록한다.
pam_service_name= vsftpd
: vsftpd 서버의 PAM 제어를 위한 서비스 명을 등록한다. 등록된 이름으로 /etc/pam.d/에 설정 파일이 만들어진다.
● /etc/pam.d/vsftpd
sense [deny | allow] 설정에 따라 /etc/vsftpd/ftpusers에 대한 설정이 바뀐다.
- Deny : ftpusers에 등록된 계정은 ftp 접속을 불허한다.
- Allow : ftpusers에 등록된 계정만 ftp 접속을 허용한다.
● 사용자 제한 설정(ftpusers) 실습
- /etc/pam.d/vsftpd 파일에 st01을 추가한다.
- 앞서 실습한 사용자 제한 설정과의 충돌을 방지하기 위해 user_list 설정을 비활성화한다.
※ /etc/pam.d/vsftpd에 Deny가 설정된 경우
- 리스트에 등록됐던 st01은 접근이 불가하다.
- 리스트에 등록되지 않았던 st02는 접근이 가능하다.
※ /etc/pam.d/vsftpd에 Allow가 설정된 경우
- 리스트에 등록됐던 st01은 접근이 가능하다.
- 리스트에 등록되지 않았던 st02는 접근이 불가하다.
● 사용자 제한 설정(user_list, ftpusers 설정 충돌)
user_list 방식과 ftpusers 방식의 설정이 충돌할 경우를 확인한다.
/etc/vsftpd/user_list, /etc/pam.d/vsftpd 파일 모두 st01 계정이 등록된 상태이다.
※ user_list로 리스트 인원만 접속 허용, ftpusers로 리스트 인원 접속 거부한 경우
- 리스트에 등록된 st01과 등록되지 않은 st02 모두 접근이 불가하다.
※ user_list로 리스트 인원 접속 거부, ftpusers로 리스트 인원만 접속 허용한 경우
- 리스트에 등록된 st01과 등록되지 않은 st02 모두 접근이 불가하다.
** 접근 제한 설정이 충돌할 경우 접근 거부 설정이 우선시 된다.
'일일 정리' 카테고리의 다른 글
리눅스 Firewall 설정 (0) | 2025.05.08 |
---|---|
리눅스 Firewall (5) | 2025.05.02 |
방화벽 환경 구축 (1) | 2025.04.30 |
방화벽 구축 (0) | 2025.04.29 |
방화벽 환경 준비 (1) | 2025.04.28 |