[Linux/SSH] SSH์ ํฌํธ ๋ถ๋ฆฌํ์ฌ SFTP ์๋ฒ ๊ตฌ์ฑํ๊ธฐ (+ChrootDirectory)
๐ก SFTP๋?
SSH File Transfer Protocol. SSH ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ์์ ํ๊ฒ ํ์ผ์ ์ ์กํ๋ค.
๐ ํ๊ฒฝ
AWS EC2 : Amazon Linux 2/2023
๐ซ SFTP ๊ตฌ์ฑํ๊ธฐ
0. openssh ์ค์น
Amazon Linux์๋ ๊ธฐ๋ณธ์ ์ผ๋ก openssh ํจํค์ง๊ฐ ์ค์น๋์ด ์๋ค.
1. sftp client๊ฐ ์ฌ์ฉํ ์ ์ /๊ทธ๋ฃน ์์ฑ
groupadd sftp-only
# /sbin/nologin๋ shell ์ฌ์ฉ ๋ถ๊ฐ
useradd -s /sbin/nologin -g sftp-only -c 'SFTP Test' sftp-user
echo 'P@ssw0rd~!' | passwd --stdin sftp-user
sftp-only๋ผ๋ ๊ทธ๋ฃน ์์ฑ ํ, ํด๋น ๊ทธ๋ฃน์ผ๋ก ์ง์ ํ์ฌ sftp-user๋ผ๋ ์ ์ ๋ฅผ ์์ฑํ๋ค. sftp-user์ ๊ฐ์ ์ ์ ๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ๊ฐ์ ์ด๋ฆ์ ๊ทธ๋ฃน์ด ์ถ๊ฐ๋์ง ์๋๋ก ์์ ๊ฐ์ด ์ค์ ํ์๋ค. /sbin/nologin ์ ์ด์ฉํ์ฌ sftp-user๋ shell์ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ์ค์ ํ๋ค.
2. sshd_config ํ์ผ ์์ ํ๊ธฐ
2-1. internal-sftp
# vi /etc/ssh/sshd_config
Subsystem sftp internal-sftp
Linux ๊ธฐ๋ณธ ์ค์ ์ sftp-server๋ฅผ ์ด์ฉํ์ฌ Subsystem sftp /usr/libexec/openssh/sftp-server ์ผ๋ก ์ค์ ๋์ด ์๋ค. internal-sftp๋ 2008๋ OpenSSH 4.8๋ถํฐ ์ ์ฉ๋ ๊ธฐ๋ฅ์ผ๋ก sftp-server๋ณด๋ค ์ต์ ๊ธฐ๋ฅ์ด๋ฉฐ, sshd_config ์ค์ ์ ํตํด ๋น๊ต์ ๊ฐ๋จํ๊ฒ Chroot ํ๊ฒฝ์ ๊ตฌ์ฑํ ์ ์์ด sftp-server ๋์ internal-sftp๋ฅผ ์ด์ฉํ์๋ค.
2-2. sftp-only ๊ทธ๋ฃน์ sftp ๊ถํ ๊ตฌ์ฑํ๊ธฐ
# vi /etc/ssh/sshd_config
Subsystem sftp internal-sftp
Match Group sftp-only
ChrootDirectory {ํ์ผ ๊ฒฝ๋ก}
ForceCommand internal-sftp
sfpt-only ๊ทธ๋ฃน์ ๋ํด chroot jail์ ๋๊ณ , internal-sftp๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ForceCommand๋ฅผ ํตํด ~/.ssh/rc์ ์๋ ๋ช ๋ น์ ๋ฌด์ํ๊ณ internal-sftp๋ฅผ ๊ฐ์ ๋ก ์คํํ ์ ์๊ฒ ํ๋ค.
ChrootDirectory {ํ์ผ ๊ฒฝ๋ก}
๐ก ChrootDirectory๋?
Chroot๋ change root์ ์ค์๋ง๋ก ํน์ ์ ์ ์ ๋ํด ๋ณด์ฌ์ง๋ root directory๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ค. Chroot๊ฐ ์ ์ฉ๋๋ฉด ๋ชจ๋ ํ๋ก์ธ์ค๋ ์ง์ ๋ ๊ฒฝ๋ก(๋ณ๊ฒฝ๋ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ)์ ํด๋น ์๋ธ ๋๋ ํ ๋ฆฌ์๋ง ์ ๊ทผํ ์ ์๋ค. ์ง์ ๋ ๊ฒฝ๋ก(๋ณ๊ฒฝ๋ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ) ์ธ๋ถ์์ ์ฝ๊ฑฐ๋ ์ธ ์ ์์ผ๋ฏ๋ก chroot jail์ด๋ผ๊ณ ํ๋ค. ์ฐธ๊ณ ๋ก, chroot๋ ์ปค๋ ์์ค ๊ฐ์ํ์๋ ์ด์ฉ๋๋ค.
๋จ, ChrootDirectory๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ๊ฒฝ๋ก์ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ root ์์ ์ ๋๋ ํ ๋ฆฌ์ฌ์ผ ํ๋ฉฐ, ๋ค๋ฅธ ์ ์ ๋ ๋ค๋ฅธ ๊ทธ๋ฃน์ด ์ฐ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅ(not writable)ํด์ผ๋ง ํ๋ค. ์๋ฅผ ๋ค์ด ChrootDirectory /data/sftp/abc ์ธ ๊ฒฝ์ฐ /data, /sftp, /abc ๋๋ ํ ๋ฆฌ ๋ชจ๋ root ์์ ๊ถ์ด์ด์ผ ํ๋ฉฐ, ๋ค๋ฅธ ์ ์ ๋ ๊ทธ๋ฃน์๊ฒ ํด๋น ๋๋ ํ ๋ฆฌ์ ๋ํด์๋ ์ฐ๊ธฐ ๊ถํ์ด ์์ด์ผ ํ๋ค.
โ ๏ธ sftp-user ๋ํ ํด๋น ๊ฒฝ๋ก์ ๋ํด์ ์ฐ๊ธฐ ๊ถํ์ด ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฒฝ๋ก๋ก ํ์ผ ์ ๋ก๋๊ฐ ๋ถ๊ฐ๋ฅํ๋ค. sftp client๊ฐ ํ์ผ ์ ๋ก๋๋ฅผ ์ํด์๋ ํด๋น ๋๋ ํฐ๋ฆฌ ๋ด ํ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํด์ผ๋ง ํ๋ค. โ ๏ธ
2-2. sftp์ ssh ํฌํธ ๋ถ๋ฆฌํ๊ธฐ
# vi /etc/ssh/sshd_config
Port 2022
Subsystem sftp internal-sftp
Match Group sftp-only
ChrootDirectory {ํ์ผ ๊ฒฝ๋ก}
ForceCommand internal-sftp
Match LocalPort 2022
ForceCommand internal-sftp
SFTP์ ์ฌ์ฉํ๊ณ ์ถ์ ํฌํธ๋ฅผ Port {ํฌํธ๋ฒํธ}๋ก ์์ฑํ๊ณ Match ๊ตฌ๋ฌธ + ForceCommand๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ํฌํธ์ internal-sftp๋ฅผ ๊ฐ์ ํ๋ค. ๋ค๋ง ์ด ๊ฒฝ์ฐ, SSH๋ 22๋ฒ ํฌํธ๋ง ๊ฐ๋ฅํ์ง๋ง SFTP๋ 22, 2222๋ฒ ํฌํธ์์ ๋ชจ๋ ๊ฐ๋ฅํ๋ค.
2-2๊น์ง /etc/ssh/sshd_config ๋ฅผ ์์ ํ๊ณ ๋์ sshd๋ฅผ ์ฌ์์ํ๋ฉด 2022 ํฌํธ๋ ๋ฆฌ์ค๋๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.