일일 정리

서버 보안 설정, FTP

mysecurity 2025. 5. 1. 22:56

목차

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