Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

개발 노트

sshd chroot 본문

개발/개발노트

sshd chroot

라이아 2021. 8. 18. 18:55

서버의 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
Comments