서버/리눅스

[리눅스] FTP보안설정

장동규 2017. 4. 25. 19:21

보안설정 목적

사용자별로 데이터 공개범위를 두어 서버의 데이터를 보호한다.


목차


/etc/vsftpd/vsftpd.conf

12 anonymous_enable=                 익명 계정 연결 허용 여부( anonymous )

16 local_enable=                          로컬 사용자 계정 연결 허용 여부( server user ) >>(12, 16)둘다 NO하면 서버 차단

19 write_enable=                            쓰기권한 허용 여부( local사용자 대상)

23 local_umask=022                      어느권한으로 설정할건가요?? ( 쓰기권한 차단 )

29 #anon_upload_enable=YES         익명사용자 쓰기권한 = 주석이걸려있으므로 풀면 anonymous계정의 업로드가 허용된다.

33 #anon_mkdir_write_enable=YES   익명사용자 디렉터리 생성 여부

37 dirmessage_enable=                 접속시 메세지

40 xferlog_enable=YES                  xferlog 사용 여부

43 connect_from_port_20=YES        20번 포트로 연결

53 #xferlog_file=/var/log/xferlog     log저장경로 이게 기본값이니 바꾸고싶으면 주석풀고 바꿔서 사용한다

60 #idle_session_timeout=600        세션의 접속시간을 제한한다. 이것도 기본값이니 바꾸고 싶으면 주석풀고 바꿔서 사용한다.

63 #data_connection_timeout=120  데이터 전송시간을 제한한다 이것도 기본값이니 바꾸고 싶으면 주석풀고 바꿔서 사용한다.

67 #nopriv_user=ftpsecure             anonymous 사용자를 ftpsecure사용자로 처리한다.

100 #chroot_local_user=                상위 디렉터리 접근 거부 여부

101 #chroot_list_enable=                상위 디렉터리 예외 리스트 사용 여부

103 #chroot_list_file=/etc/vsftpd/chroot_list    위의 설정에서 제외될 사용자 계정 리스트 파일( 관리자만들어주는것 같다 )

114 listen=NO                            (ftp동작상태) init 상태 (다른 데몬에의해 ftp데몬이 동작할때 변경)

123 listen_ipv6=YES                     (ftp동작상태) Standalone 상태  (ftp데몬이 혼자 동작하는상태)

125 pam_service_name=vsftpd        PAM 인증시 파일 이름 지정

126 userlist_enable=Yes                사용자 계정 접근제어 목록 사용여부

127 tcp_wrappers=Yes                    tcp_wrapper 접근제어 사용여부( 호스트 ip를 가지고 접근하는 것 )


상위 디렉터리 이동 막기

local사용자로로 접속하게 되면 시작디렉터리는 홈디렉터리이다.

홈디렉터리의 상위디렉터리는 모든유저들의 홈디렉터리가 보관된 디렉터리이므로 어떤유저가 있는지 노출된다.


#모든 사용자의의 상위 디렉터리 이동막기 (쓰기권한해제)

#>vi /etc/vsftpd/vsftpd.conf

100 #chroot_local_user=YES >> 주석해제(#제거)

#>systemctl restart vsftpd

>> ftp의 버전이 높아지면서 보안이 강화되었다.

>> 이 옵션을 실행히시키면 쓰기권한도 같이 막혀버린다.

>> 따라서 유저의 홈디렉터리의 쓰기권한(O)과 FTP쓰기권한(X)가 충돌을 일으켜 login failed발생한 것이다.

>> 로그인하려는 사용자의 홈디렉터리에서 쓰기권한을 해제하자.

#>chmod 500 ~admin01 (로그인하려는 사용자)

>>로그인 하면 성공적으로 로그인되었다.

>>홈디렉터리에서 시작하지만 작업공간은 "/"은 이렇게 뜬다.

>>하지만 이상황은 다운로드만 가능한 상황이다. 다시 쓰기 권한을 주고 ftp설정파일에서 옵션하나를 추가한다.


#모든 사용자의의 상위 디렉터리 이동막기 (쓰기권한설정)

#>chmod 700 ~admin01

#>vi /etc/vsftpd/vsftpd.conf

104 allow_writeable_chroot=YES    : 104 번에 옆과 같이 쓰기권한을 작성해준다. 다시로그인

:wq

#>systemctl restart vsftpd


특정 사용자만 거부

/etc/vsftpd/vsftpd.conf

#>vi /etc/vsftpd/vsftpd.conf

100 #chroot_local_user=YES

101 chroot_list_enable=YES

103 chroot_list_file=/etc/vsftpd/chroot_list

104 allow_writeable_chroot=YES

:wq

#>systemctl restart vsftpd

>> 101, 103 주석을 해제후 104번에 쓰기권한 추가한다.

>> 데몬 재시작


/etc/vsftpd/chroot_list

#>/etc/vsftpd/chroot_list

1 admin01

:wq

>> 허용할 계정을 입력하고 나온다.

>>다른 계정은 상위디렉터리로 이동이 가능하다.


특정 사용자만 허용

/etc/vsftpd/vsftpd.conf

#>vi /etc/vsftpd/vsftpd.conf

100 chroot_local_user=YES

101 chroot_list_enable=YES

103 chroot_list_file=/etc/vsftpd/chroot_list

104 allow_writeable_chroot=YES

:wq

#>systemctl restart vsftpd

>> 100, 101, 103 주석을 해제후 104번에 쓰기권한 추가한다.

>> 데몬 재시작



/etc/vsftpd/chroot_list

#>/etc/vsftpd/chroot_list

1 admin01

:wq

>> 허용할 계정을 입력하고 나온다.


접근제어

TCP_WRAPPERS (TCP접근제어)

1) tcp_wrappers=YES : TCP( 로컬 ip로 이용하는 접근에 대한 설정, 기본값이 YES이다. )

/etc/hosts.allow    :    허용 할 ip

/etc/hosts.deny    :    거부 할 ip

ip에는 네트워크 대역이 올수도 있다.


/etc/hosts.allow : [데몬] : [허용할 ip]

vsftpd : 100.100.100.    #100.100.100 대역전체 허용

:wq

ALL : ALL     >> 모든 서비스에 대한 전체허용


/etc/hosts.deny: [데몬] : [거부할 ip]

vsftpd : ALL                #vsftpd데몬에 대한 전체허용

:wq


우선순쉬 : allow > deny ( allow에서 ALL로 다 열어놓으면 deny파일이 쓸모가 없어지는것이다. )


#deny만 설정하고 allow 설정안했을때

421 Service not available : 서비스를 하지 않습니다.라고 뜨면서 호스트가 막혀있는것을 확인 할 수 있었다.



VSFTPD ( userlist 접근제어 )

126 userlist_enable=YES

/etc/vsftpd/user_list : 리스트에 있는 사용자를 전부 접근거부한다.

>> 그래서 root로 로그인을 했을때 권한없음이 발생한 것이다.

#>vi /etc/vsftpd//user_list

~~~

~~~

~~

admin01         : 로그인할 계정 추가

:wq

이렇게 되면 root계정에서 접속하려던 것처럼 530 Permission denied에러가 발생한다.


#user_list에 적힌 사용자만 허용하고 싶을때.

#>vi /etc/vsftpd/vsftpd.conf

127 userlist_deny=NO        :    한줄 추가

:wq

#>systemctl restart vsftpd

다시 로그인

>> userlist_deny=NO 한줄 추가하므로써 user_list에 있는 목록들은 전부 허용가능한 계정으로 바뀐것이다. 

그래도 아직 root계정은 로그인 되지않는다.


PAM모듈

PAM : Plugablle Athorization Module

어떤것에 대한 인증을 하는 모듈로써 이 모듈로 접근제어를 시도한다.


125 pam_service_name=vsftpd

#>vi /etc/pam.d/vsftpd

:q

다른것들은 잠시 접어두고 이 부분을 보면 된다.

deny file=/etc/vsftpd/ftpusers  : 권한거부에 해당하는 유저들을 모아둔 파일이다.

#>vi /etc/vsftpd/ftpusers

root    (dd)

:wq

user_list에 있던 사용자들은 여기에 다있었다. 여기에서도 2중으로 제어를 하고있었기에 root계정은 로그인이 되지않았던것이다.

여기서 root를 지워주면 root 계정으로 로그인이 가능하다.

client#>ftp ip

원래 관리자같은경우는 잘 안열어주기에 2중으로 제어했던것 같다.


Active / Passive

[Active] : 고유의 20번 21번 포트로 서버가 클라리언트한테 데이터포트접속에 대한 접속여부를 물어본다.

 이때 방화벽을 해제해야하며 노출되는 순간 보안에 위협을 받는다.


#passive Mode 해제

#>vi /etc/vsftpd/vsftpd.conf
pasv_enable=NO            #맨아래에 추가

:wq

#>systemctl restart vsftpd

>>맨아래에 pasv_enable=NO 라인을 추가한다.


#client 접속 ( 옵션 -A 사용 )

client#>ftp -A ip

  #>dir        : 그냥 명령어를 보내기 위함

option -A : active mode


연결된 포트를 확인한다.

server#>ss -ant


active모드로써 20번포트와 21번포트가 열려있는것을 확인할 수 있다.


[Passive] : 서버가 클라이언트에게 묻는 고유의 포트를 여는것을 방지하기 위해 

  클라이언트측에서 21번 포트로 랜덤의 포트번호를 전송하므로써 서버가 클라이언트에게 묻는상황을 만들지않는다.


MIN~MAX 포트번호를 지정해서 열어놓는다. ( 데이터통신포트 ) 

이때 최소 포트번호는 1024이상이며 높은 번호의 포트를 열어야한다. ( 아래포트는 이미 다사용중이므로 충돌방지 )

#passive Mode 설정

#>vi /etc/vsftpd/vsftpd.conf
pasv_enable=YES           #맨아래에 추가

pasv_min_port=4000

pasv_max_port=4100


:wq

#>systemctl restart vsftpd


#client접속

client#>ftp ip

  #>dir        : 그냥 명령어를 보내기 위함

default가 passive 모드


연결된 포트를 확인한다.

server#>ss -ant


20번의 고정포트가 풀리면서 설정했던 포트중 하나가 사용되었다.


네트워크 대역대 설정방법

100.100.100.                                :  100.100.100.1 ~ 100.100.100.254 까지의 ip (0과 255는 예약ip)

100.100.100. EXCEPT 100.100.100.3   :  100.100.100.1 ~ 100.100.100.254 에서 100.100.100.3을 제외한 모든 ip

100.100.100.1/255.255.255.0            : netmask사용법

100.100.100.1/24                          : prefix 사용법