서버 보안강화 - 접근
| topics | 800-프로젝트 400-인프라 & 아키텍처 805 미니서버 구축기 |
| types | 실습 도구 |
| contexts | 프로젝트 |
| tags |
GitHub Actions로 배포 시 사용할 배포 계정 생성 및 접근 권한 설정
---|-----|
| 그룹 | deployers |
| 그룹 관리자 | deploy |
| 사용자 | deploy1, deploy2 |
2. 공개키 설정
공개키는 기본적으로 /home/사용자명/.ssh/authorized_keys에 있다. sshd_config에서 변경 가능하다.
AuthorizedKeysFile 경로
팁: 경로에
%u를 쓰면 동적으로 유저 이름 값을 넣을 수 있다.
유의점
해당 공개키는:
- 해당 사용자가 소유권을 가지고 있어야 함
- 해당 사용자만 읽고(4) 쓸 수(2) 있는 권한이 있어야 함
sudo chown -R 사용자명:그룹명 파일경로
sudo chmod 755 경로
sshd_config 보안 설정
PermitRootLogin no # root 비활성화
PasswordAuthentication no # password 비활성화
PubkeyAuthentication yes # Key authentication 활성화
3. 접근 권한 설정
배포 계정이 접근할 수 있는 파일을 제한하고 싶었다. /release 안에 home 폴더를 만들어 deployers 그룹만 접근 가능하게 하고 싶었다.
방법 1: ChrootDirectory
ChrootDirectory는 일종의 감옥으로 루트 디렉토리를 특정 경로로 변경한다. 해당 디렉토리가 루트로 새로운 환경을 구성하는 것이다.
sshd_config에서 지정할 수 있으며 그룹별로도 가능하다.
단점: 분리된 환경이므로 로그인에 필요한 장치들이 중복 필요하다. 예를 들어 /release를 ChrootDirectory로 한다면, /bin/bash, 공개키 등이 /release 안에 있어야 쉘로 접속 가능하다.
왜 안 썼냐면: 시스템 모니터링 등을 할 수 있는 사이트도 배포하고 싶어서 시스템 정보 인터페이스를 읽을 수 있어야 했다.
방법 2: 리눅스 ACL 설정 (선택)
ACL은 접근 제어 리스트이다
sudo apt-get install acl
기본적으로 허가권을 이용해서 파일 접근을 허가하면 3가지 분류밖에 없다:
- 소유자 / 그룹 / other
하지만 other에서 더 세세한 분류를 하고 싶었다.
원하는 구조:
- 개인 파일이 들어간 폴더: admin 그룹만 접근 가능
- /release: deployers 그룹뿐만 아니라 admin 그룹도 접근 가능
setfacl 명령어
setfacl {옵션} {누구,권한} {경로}
| 옵션 | 설명 |
|---|---|
| -m | modify |
| -x | remove |
| 누구/권한 | 설명 |
|---|---|
| d | default값으로 추가 (하위 폴더 생성 시 이 접근 권한 추가) |
| u | 사용자 |
| g | 그룹 |
| rwx | read write execute |
예시:
sudo setfacl -m d:g:admin:rwx ./release
이렇게 /release 폴더에 admin 그룹도 접근/수정/실행이 가능하도록 변경했다.