개발 노트
sshd chroot 본문
서버의 root 계정을 여러명이 이용하여 각자의 프로젝트들을 사용하였는데,
해당 부분은 보안적인 문제와 불필요한 권한이 각각의 개발자에게 제공되는것을 막고자 작업하였다.
서버에 대해 잘 알지 못하지만 내가 하자고 했으니 내가 마무리 지어야 하기에...
[ 개요 ]
서버 : amazon linux2
프로젝트 모여있는 폴더 : /var/www
프로젝트 폴더 : /var/www/aaa
이외 프로젝트 폴더 : /var/www/bbb, /var/www/ccc 등..
사용 계정 : test
[ 작업 목표 ]
test 계정으로 SFTP 접근시 aaa폴더가 root 경로로 설정되어 aaa 폴더 이외의 파일들에 접근하지 못하게 하는것
우선 아래와 같은 소스를 이용하여 `test` 사용자를 추가하였다.
# useradd
> 사용자 추가하기
useradd -d /home/test test
passwd test
[ 각 옵션 설명 ]
-m 홈 디렉토리 생성
-g 그룹지정
-d 디렉토리 지정
-s 쉘(shell) 지정
-p 비밀번호 지정
# adduser
> 비밀번호 설정, 홈 디렉토리 생성등을 알아서 처리해줌
> 홈 디렉토리 생성시 복사하는 파일은 /etc/skel 디렉토리에 위치함
adduser test
# 사용자 추가 확인
cat /etc/passwd | grep test
# 사용자 목록
vi /etc/passwd
그리고 여기서 부터 문제가 발생하였다.
vsftpd를 이용하게 되면, chroot_local_user 설정만 지정해주면 알아서 지정된 디렉토리가 root 로 잡히는데
현재 서버에서는 sshd를 사용하여 SFTP로 접근하기 때문에 다른 방법을 찾아야했다.
vsftpd와 sshd 차이 : https://m.blog.naver.com/devilsh1004/221311824949
리눅스 ftp (vsftpd) , sftp (sshd) 차이 sftp 설정
리눅스 사용시 사용되는 ftp 와 sftp간의 차이에 대하여 정의 해둔다. FTPSFTPBINARY/usr/s...
blog.naver.com
sshd에서 chroot(Change Root Directory)를 이용하여 각 계정별로 지정해줘야했다.
우선 chroot를 이용하기 위하여 설정을 해주었다.
sshd_config (/etc/ssh/sshd_config)
# chroot를 사용하기 위한 설정
> 기존 sftp-server를 주석처리하고 internal-sftp를 사용하도록 수정
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
※ 참고로 sshd_config를 수정한 뒤에는 sshd를 재시작 해주어야함
# 설정 파일 오류 확인
sshd -t
# 재시작
systemctl restart sshd
--------------
1) 작업 1번 (실패)
1-1) sshd_config (/etc/ssh/sshd_config)
> Match를 이용하여 지정된 사용자에게만 chroot 설정 적용
Match User test
ChrootDirectory %h
ForceCommand internal-sftp
# 경로 지정
> %h - 홈 디렉토리
> %u - 인증된 사용자의 사용자 이름 지정
> %% - % 기호를 이스케이프 처리
# Match
> User - 사용자 계정
> Group - 사용자 그룹
> LocalPort - 접근 포트
1-2) 각 폴더에 Permission 및 Group 지정
/var
/www (root:root, 755)
/aaa (root:test, 755)
# 폴더 Owner/Group 수정
chown root:test /var/www/aaa
# 폴더 Permission 수정
chmod 755 /var/www/aaa
1-3) 결과
- test 계정으로 SFTP 접속시
root 폴더 : /var/www/aaa
하지만 권한이 755로 지정되어 있어서 파일을 수정하지 못함
--------------
2) 작업 2번 (실패)
2-1) Permission 및 Group 수정
/var
/www (root:root, 755)
/aaa (root:test, 775)
# 폴더 Owner/Group 수정
chown root:test /var/www/aaa
# 폴더 Permission 수정
chmod 775 /var/www/aaa
2-2) 결과
- 오류 발생 (FATAL ERROR: Network error: Software caused connection abort)
test 계정으로 sftp 접속 불가
- Chroot로 설정된 경로에는 권한이 755로 등록 되어있어야 함 (Owner만 쓰기 권한)
또한 그 상위 폴더는 모두 Owner가 root로 지정되어있어야함
--------------
3) 작업 3번 (애매한 성공?)
이번엔 Chroot Directory를 변경해보기로 하였음
3-1) sshd_config (/etc/ssh/sshd_config)
- 기존 aaa 폴더가 아닌 그 상위 폴더를 Chroot로 지정하도록 수정
Match User test
ChrootDirectory /var/www
ForceCommand internal-sftp
3-2) Permission 및 Group 수정
/var
/www (root:root, 755)
/aaa (root:test, 775)
# 폴더 Owner/Group 수정
chown root:test /var/www/aaa
# 폴더 Permission 수정
chmod 775 /var/www/aaa
3-3) 결과
- test 계정으로 SFTP 접속시
root 폴더 : /var/www
하위에 존재하는 aaa폴더 수정 가능
하지만 /var/www 폴더에 존재하는 aaa를 제외한 다른 폴더에도 접근 가능해짐 (Chroot Directory가 www니까..)
사실상 각 폴더들의 기본 권한이 755이기에 파일을 수정하지 못하고,
다른 폴더들에게 권한을 770으로 지정해두면 해당 폴더의 Group이 사용자 그룹이 아니기에 접근도 불가하지만
내가 지정한 폴더만 볼 수 있도록 하고싶었기에 해당 설정은 사용하지 않기로 함
이러한 형식으로 활용하기 위해서는 /var/www/aaa 폴더 안에
새로운 폴더를 구성하여 권한을 제공해주면 사용이 가능하다.
예를들면 /var/www/aaa/bbb 형식으로 구성하고, bbb 폴더에 root:test 및 775 권한을 제공하면 된다.
하지만 기존 프로젝트들을 모두 새로운 폴더 안으로 옮겨야 하기엔 리스크가 너무 크다고 판단되어 넘어가기로 했다.
--------------
4) 작업 4번 (실패)
새로운 경로를 해당 사용자 계정의 directory로 지정하고 심볼릭 링크를 지정하는 방법을 생각함
4-1) 사용자 디렉토리 변경
usermod -d /home/test test
4-2) sshd_config (/etc/ssh/sshd_config)
- 변경된 디렉토리로 수정
Match User test
ChrootDirectory /home/test
ForceCommand internal-sftp
4-3) 심볼릭 링크 생성
# ln -s [original Path] [new Path]
ln -s /var/www/aaa /home/test
> 생성하게 되면 /home/test에 aaa라는 심볼릭 링크가 생성됨
# 심볼릭 링크 삭제
rm /home/test/aaa
4-4) 결과
- test 계정으로 SFTP 접속시
root 폴더 : /home/test
하지만 생성된 심볼릭 링크를 접근하려 해도 아래와 같은 오류 출력
Directory /aaa: no such file or directory
관련하여 오류를 검색해보니 Chroot에서는 해당 심볼릭링크를 사용하지 못한다고 한다.
(참고 : https://blog.errorstory.net/entry/FTP-symbolic-link-%EB%B9%84%ED%91%9C%EC%A4%80-%ED%8C%81)
FTP symbolic link 비표준 팁
우선 FTP 에서 심볼릭링크(symbolic link)는 비표준이라고 합니다. 빠르게 최근 데이터들을 정리해서 보되, 사본은 만들지 않고 심볼릭링크로 접근하고 있던 부분을 쓰려고 보니 chroot 때문에 접근이
blog.errorstory.net
--------------
5) 작업 5번 (성공?!)
그리하여 찾은 방법이 bind mount를 이용하여 폴더를 연결해주는것
리눅스 커널에서 제공하는 기능이며, 심볼릭링크와 달리 실제 디렉토리처럼 연결됨
기본적으론 mount 명력어는 디스크 드라이브와 같이 블록 디바이스만 마운트 되지만, --bind 를 이용하면 서로 다른 디렉토리 끼리 연결도 가능함
( 참고 : https://awesometic.tistory.com/170 )
mount --bind 와 부팅 시 자동으로 적용하는 방법
mount --bind bind 옵션을 이용하면 특정 디렉토리를 다른 디렉토리에 붙일 수 있습니다. 리눅스에선 커널에서 제공하는 기능입니다. 성능 저하도 없고, 마치 원래 디렉토리 위치인 냥 접근할 수 있
awesometic.tistory.com
5-1) bind mount 설정
# mount --bind [original Path] [new Path]
mount --bind /var/www/aaa /home/test/html
# 연결되었는지 확인
mount | grep /html
> /dev/nvme... on /home/test/html type xfs (rw,...)
# mount 삭제
# umount [Path]
umount /home/test/html
5-2) 결과
- test 계정으로 SFTP 접속시
root 폴더 : /home/test
- test 계정의 Directory는 /home/test
아래와 같이 성공!
하지만, 이러한 형식의 단점은
Match를 이용하여 접근하는 계정별로 홈 디렉토리를 지정해주면 끝날 문제를
프로젝트가 새로이 생성될 때 마다
` 계정 추가 -> 홈 디렉토리 설정 -> Match 추가 -> 기존 프로젝트 mount 처리 -> mount 자동 재시작 처리... ` 를 매번 해주어야 하기 때문이다.
※ 주의사항
- mount는 서버가 재시작 될 경우, 자동으로 mount가 해제 되기 때문에 별도의 설정을 해줘야함
( 참고 : https://itwiki.kr/w/%EB%A6%AC%EB%88%85%EC%8A%A4_fstab )
# 자동 mount 설정
vi /etc/fstab
# 맨 아랫줄에 추가
# [대상] [목적지] [파일시스템 유형] [옵션] [덤프 주기(일)] [fsck 순서]
# [original Path] [new Path] none bind,defaults 0 1
/var/www/aaa /home/test/html none bind,defaults 0 1
※ 주의사항2
- 계정에 할당된 폴더의 권한은 해당 계정 권한으로 되어있어야 수정이 가능함
이전에 root 계정으로 폴더 및 파일을 생성했기에, 모든 소유자 정보가 root:root로 되어있어서 수정이 불가능함
그리하여 aaa 폴더 하위 파일들은 모두 소유자 정보가 test:test로 설정되어야함
- 계정을 우선 할당하고 생성한 파일은 애초부터 소유자 정보가 test로 되어있기에 상관없음
# 소유자 정보 일괄 수정
# chown -R user:group [경로]
chown -R test:test /home/test/html
# Permission 일괄 수정
# find [경로] -type d -exec chmod 755 {} \;
find /home/test/html -type -d -exec chmod 755 {} \;
( 참고 : https://faq.hostway.co.kr/Linux_ETC/7316 )
Linux ETC - 리눅스 파일 소유자, 권한 일괄 변경하기
1) sudo chown -R user:group [경로] : 소유자를 user로, 그룹을 group이라고 하고 해당 경로 이후 모든 하위 디렉토리의 소유권을 변경합니다. 예) sudo chown -R mysql:mysql /usr/local/mysql/data 2) sudo find [경로] -ty
faq.hostway.co.kr
'개발 > 개발노트' 카테고리의 다른 글
DataTables Ajax dataSrc가 사용되지 않을 경우 (0) | 2022.11.10 |
---|---|
[VSCODE] SFTP Config Error (0) | 2021.08.23 |
dompdf 한글 출력 (0) | 2021.06.08 |
SmartEditor focus (0) | 2021.05.27 |
Mysql Truncate시 foreign_key 있을경우 (0) | 2021.05.13 |