[CentOS] 하나의 계정으로 SSH와 SFTP 모두 ACCESS를 허용하는 방법
직접 서버를 운영하고 있다면 ssh(secure shell)는 필수일 것이며, 파일전송을 위한 ftp(s)나 sftp 또한 필요할 것이다. ftp(s)의 설정에 대해서는 지난번에 정리했으므로 이번에는 ssh와 sftp 설정에 대해서 간단하게 정리하고자 한다.
telnet, rlogin 등의 보안에 취약한 원격접속 프로그램을 대체하기 위해서 만들어진 ssh는 간단한 설정을 해주면 sftp(Secure File transfer protocol)로도 사용할 수 있다. 일반적으로 sftp를 선택했다면 굳이 ftp(s)를 추가로 설치할 필요는 없겠지만 나같은 경우는 sftp와 ftps를 모두 하나의 서버에 설정해 놓고 사용한다. - wordpress에서 아직도 sftp지원이 미흡하다는 것이 SFTP와 FTPS를 함께 사용하는 이유중의 하나이다. 플러그인이 있긴 하지만 워드프레스의 버전에 따라서 오작동을 하는 등의 사소한 버그가 있다.
sftp는 ssh에 기반을 둔 것이기에 아무래도 구축하는 과정에서 보안쉘의 접속까지 허용할 것인지에 대해서 고민해야 할 수도 있다. 대략...아래와 같이 구분할 수 있을 것이다.
1. ssh는 접속이 불가능하고 sftp만 가능한 계정 (일반 사용자)2. ssh는 접속이 가능하나 sftp는 불가능한 계정 (필요할까?)
3. ssh와 sftp 모두 접속이 가능한 계정 (관리자)4. ssh와 sftp 모두 접속이 불가능한 계정 (필요한가?)
'하나의 계정으로 SSH와 SFTP 모두 사용이 가능하도록 설정'하는 방법이 내게는 중요하다. 일반적인 웹호스팅 환경에서 사용자에게 ftp(s)나 sftp를 허용하는 것은 당연하겠지만, 보안쉘(ssh)의 접속까지 허용하는 경우는 흔하지 않을 것이다. 일반 사용자들에게는 파일 전송만을 허용하고, 관리자가 사용할 계정은 sftp와 ssh모두를 허용하도록 설정해 볼 것이다.
ssh의 설정파일은 /etc/ssh/sshd_config이다. 설정을 바꾼 후에는 sshd를 재시작 해야 한다.
# systemctl restart sshd
(1) 기본포트의 변경
17번째 줄에서 ssh의 포트를 변경할 수 있다. 임의의 포트로 변경하는 경우에는 해당 포트를 방화벽에서 열어줘야 한다.
# firewall-cmd --permanent --zone=public --add-port=nnn/tcp
(2) root 로그인은 허용하지 말자
46번째 줄의 PermitRootLogin의 주석을 해제하고(#제거), 값을 no로 설정하자. root 계정의 접속을 허용하는 것은 위험하다.
(3) ssh(sftp)를 허용할 계정(그룹)의 설정
AllowUsers나 AllowGroups 구문을 이용해서 ssh(sftp)의 접속을 허용할 계정이나 그룹을 설정할 수 있다. 계정이나 그룹이 두 개 이상이라면 공백으로 구분한다. 이와 반대로 DenyUsers와 DenyGroups도 설정할 수 있지만......AllowUsers를 설정하는 순간 AllowUsers에서 제외된 모든 계정은 자동으로 DenyUsers가 되므로 둘 중 하나만 사용해도 충분하다. Allowusers / AllowGroups / DenyUsers / DenyGroups는 sshd_config에서 생략되어 있으며, 그 기본값은 모든 계정, 모든 그룹의 접속 허용이다. 대략 46번째 줄의 PermitRootLogin의 다음줄에 추가하는 것이 가장 찾기 쉬울 것 같다. 물론 어디에 위치해도 상관없다.
이정도로 설정해 두어도 ssh(sftp)의 접속을 허용한 계정(그룹)은 ssh, sftp 모두 접속이 가능하다. 관리자 계정이 아닌 일반 사용자의 계정이라면 굳이 ssh의 접속을 허용할 필요가 없을 것이며, 계정의 홈디렉토리의 상위로 벗어나는 것도 허용할 필요는 없을 것이다.
(4) 일반 사용자 계정의 설정(sftp 허용, ssh 접속불가)
sshd_config의 하단의 내용은 아래와 같다.
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
그리고 아래와 같이 마지막에 세 줄을 추가해보자.
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
Match User pius
ChrootDirectory /home/pius
ForceCommand internal-sftp
이제 해당 계정(pius)은 ssh접속이 불가능하며, sftp접속시에도 홈디렉토리의 상위로 이동할 수 없게 된다. 만약 ChrootDirectory 구문을 생략하면 홈디렉토리의 상위로 이동이 가능해진다. 하지만 ChrootDirectory를 이용해서 쉘접속에서 접근할 수 있는 최상위 디렉토리를 제한하는 것은 불가능하다. ChrootDirectory 구문에서 계정의 홈디렉토리 경로는 %h로 대체할 수 있다.
위에서 추가한 3줄 중에서 2,3번째 줄을 생략하면 3줄 모두 생략한 것과 결과가 같다. (즉, ssh, sftp 모두 접속이 가능하다.) 2번째 줄(ChrootDirectory)을 생략하면 ssh접속은 불가능하며, sftp접속시에 모든 디렉토리로의 이동이 가능하다. 3번째 줄(ForceCommand)을 생략하면 ssh와 sftp 모두 접속이 불가능해진다.
만약 ssh와 sftp 모두 사용할 수 없는 계정을 만들어야 한다면 AllowUsers(Groups)에서 제외시키거나 DenyUsers(Groups)에 추가하는 것이 더 옳은 설정일 것이다.
각 계정의 홈디렉토리일지라도 chrootdirectory로 설정된 디렉토리의 소유권은 root 계정이 갖고 있어야 한다. 따라서 해당 계정이 sftp로 홈디렉토리에 접근했을 때에 권한문제로 오류가 발생하지 않도록 최소한의 권한(읽기와 실행 허가-755, 705 등)을 위한 퍼미션 조정이 필요하다. 그리고 그 하위에 해당계정 소유의 별도의 디렉토리를 추가로 만들어주면 원활한 사용이 가능할 것이다. 물론 관리자가 사용할 계정(로그인 후 su나 sudo 사용)이라면 sftp와 ssh 모두 접속이 가능해야 할 것이며 chrootdir의 설정은 오히려 불편할 수 있다.
(5) sftp와 ssh의 포트 분리
서버에서 sftp 서비스를 제공하려면 sftp(ssh)의 포트를 노출 시킬 수 밖에 없다. 이러한 경우 노출시킨 포트는 sftp 전용(ssh 접속 불가)으로 설정하고, 별도의 포트를 추가하여 공개하지 않고 관리자만 사용하는 방법도 있다. 즉, 공개된 포트는 sftp만 접속이 가능하며, 비공개 포트는 관리자 용으로 ssh와 sftp 모두 사용이 가능하다. 아래와 같이 /etc/ssh/sshd_config를 열어서 Port를 추가해 보자.
13 # If you want to change the port on a SELinux system, you have to tell
14 # SELinux about this change.
15 # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
16 #
17 Port 5555
18 Port 6666
19 #AddressFamily any
20 #ListenAddress 0.0.0.0
21 #ListenAddress ::
22
23 HostKey /etc/ssh/ssh_host_rsa_key
위의 예에서 Port 5555는 일반 사용자들이 sftp 접속용으로 사용할 예정이며, Port 6666은 관리자가 보안쉘 접속용으로 사용할 계획이라면 아래와 같이 Port 5555는 sftp 접속만 허용하게 만들 수 있다. 설정파일의 가장 마지막 부분을 살펴보자.
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
Match User aegypius
Match User pius
ChrootDirectory %h
ForceCommand internal-sftp
Match LocalPort 5555
ForceCommand internal-sftp
Match User harepius
ChrootDirectory %h
ForceCommand internal-sftp
위와 같은 설정으로 일반 사용자 계정(pius, harepius)은 Port 5555를 통해서 sftp에 접속이 가능하며, ssh의 접속은 불가능하다. aegypius 계정도 Port 5555를 통해서 sftp 접속이 가능하며 Port 6666을 통해서 ssh와 sftp접속이 가능하다.
추가한 포트 또한 방화벽에서 열어 두어야 한다.
CentOS 8에서 sftp를 사용하고 있으며, 서버로 업로드한 파일이나 디렉토리의 퍼미션이 이상하다면 아래 링크의 글을 참고하자.
2020/12/17 - [Linux/TIP] - sftp로 upload한 파일, 디렉토리의 permission 오류(?!) 해결방법
'Linux > for Hosting' 카테고리의 다른 글
무료 SITEMAP 생성 (0) | 2020.12.10 |
---|---|
[wordpress] Error establishing a database connection (0) | 2020.11.21 |
freenom...... (0) | 2020.11.08 |
[그누보드5] 사이트를 한 개 이상으로 복사(copy)하기... (0) | 2020.11.02 |
[그누보드5] 사이트맵 생성하기 (0) | 2020.09.09 |
댓글