TIL/Linux

[Linux/SSH] SSH์™€ ํฌํŠธ ๋ถ„๋ฆฌํ•˜์—ฌ SFTP ์„œ๋ฒ„ ๊ตฌ์„ฑํ•˜๊ธฐ (+ChrootDirectory)

์•ˆ๋ƒ์„ธ์šค 2024. 1. 7. 22:07

๐Ÿ’ก 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๊ฐ€ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์•ผ๋งŒ ํ•œ๋‹ค. โš ๏ธ 

[์ถœ์ฒ˜] https://man.openbsd.org/sshd_config#ChrootDirectory

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 ํฌํŠธ๋„ ๋ฆฌ์Šค๋‹๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ”— ์ฐธ๊ณ  ๋งํฌ

  1. Zetawiki: sftp-server์™€ internal-sftp ์ฐจ์ด
  2. OpenBSD ๊ณต์‹ ์›น์‚ฌ์ดํŠธ: sshd_config manual
  3. ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ: What is chroot jail and How to Use it?