상세 컨텐츠

본문 제목

[Centos 8] Chroot 기반 SFTP 서버 구성하기

카테고리 없음

by Keunwoo.LEE 2023. 1. 17. 17:50

본문

반응형

0. 배경

- SFTP 서버에 여러 사용자를 관리할때 각 사용자가 본인의 홈 디렉토리 이외에 어떠한 디렉토리도 확인이 불가능 하도록 구성

- chroot 환경이란 본인의 홈 디렉토리가 마치 root 디렉토리인 것처럼 보이게 하는 기술

- 아래 구성은 Centos 6, 7, 8 모두에서 사용 가능

 

1. SFTP 전용 그룹 생성

> groupadd sftpusers

2. SFTP chroot 환경 설정

# 사용자 그룹이 sftpusers 인 경우 chroot 적용
> vi /etc/ssh/sshd_config
#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp -f local2 -l INFO  /* 일반 유저의 sftp logging 설정. local2를 설정한 이유는 secure 파일에 저장하기 위함. */
Match Group sftpusers
        ChrootDirectory %h
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp -l INFO               /* chroot에서 사용할 ForceCommand에서는 -f 옵션이 적용되지 않음. 디폴트로 secure 파일에 저장 됨. */

> systemctl restart sshd

3. sftp logging 설정

> vi /etc/rsyslog.conf
# SFTP Logging
local2.*                                                /var/log/secure  /* 일반 유저의 log를 secure 파일에 전송 */

> systemctl restart rsyslog

4. SFTP 전용 사용자 생성 (ex : user1.sftpusers)

1. ID 생성
> useradd -g sftpusers -s /sbin/nologin user1
> passwd user1

2. 작업 디렉토리 생성 및 권한 부여
# 각 사용자의 home 디렉토리는 root.root의 소유여야 하고, 작업 디렉토리는 해당 사용자의 소유여야 함
> mkdir -p /ftp_incoming/user1/workspace
> chown user1.sftpusers /ftp_incoming/user1/workspace/
> chmod 755 /ftp_incoming/user1

3. home 디렉토리 변경
> usermod -d /ftp_incoming/user1 user1

4. workspace(작업 디렉토리) 디렉토리를 당사 유저가 이용할 수 있도록 권한 수정
> chmod 707 /ftp_incoming/user1/workspace

5. sftp logging을 위하여 디렉토리 생성
> mkdir -p /ftp_incoming/user1/dev

6. SFTP 서비스 특성상 패스워드 변경이 쉽지 않기 때문에 패스워드 변경 정책 변경
> chage -M 99999 user1
> chage -m 0 user1

7. sftp 전용 사용자의 logging을 위해 rsyslog.conf에 socket 추가
> vi /etc/rsyslog.conf
$AddUnixListenSocket /ftp_incoming/user1/dev/log                        /* chroot 환경에서 /dev/log 를 참조할 수 없기때문에 user별로 log socket을 생성하여 secure 파일에 logging */

> systemctl restart rsyslog

5. 위의 사용자 ID 생성을 위한 script

> vi add_sftp_user.sh
#!/bin/sh
echo "Input SFTP User Account :"
read sftpuserid
if [ ! $sftpuserid ]; then
        echo "Are you kidding -_-?"
        exit 0
fi
 
echo "$sftpuserid : OK? (y/n)"
read yorn
 
if [ $yorn == "y" ]; then
        useradd -g sftpusers -s /sbin/nologin $sftpuserid
 
        mkdir -p /ftp_incoming/$sftpuserid/workspace
        chown $sftpuserid.sftpusers /ftp_incoming/$sftpuserid/workspace/
 
        usermod -d /ftp_incoming/$sftpuserid $sftpuserid
 
        chmod 755 /ftp_incoming/$sftpuserid
        chmod 707 /ftp_incoming/$sftpuserid/workspace
 
        mkdir -p /ftp_incoming/$sftpuserid/dev
 
        chage -M 99999 $sftpuserid
        chage -m 0 $sftpuserid
 
        passwd $sftpuserid
 
        echo "vi /etc/hosts.allow !!! (Add Client IP)"
        echo "vi /etc/rsyslog.conf !!! (Add Unix Listen Socket)"
else
        echo "Are you kidding -_-?"
fi
반응형

댓글 영역