-rw-r--r-- 1 ubuntu ubuntu file.txt
│││││││││
│││││││└┴─ Other: r-- (읽기)
││││└┴┴─── Group: r-- (읽기)
│└┴┴────── User: rw- (읽기+쓰기)
└───────── 타입 (-:파일, d:디렉토리)
제약: 파일당 1개 그룹만 지정 가능 → ACL로 해결
전체 흐름: 계정 생성(서버) → SSH 키 생성(클라이언트) → 공개키 등록(서버) → 접속 테스트
# EC2 서버에서 실행
sudo adduser readonly_user
접속할 로컬 머신에서 실행
# Ed25519 (권장 - 더 짧고 안전)
ssh-keygen -t ed25519 -f ~/.ssh/readonly_key -C "readonly_user@myserver"
# RSA 4096 (구형 시스템 호환 필요시)
ssh-keygen -t rsa -b 4096 -m PEM -f ~/.ssh/readonly_key
chmod 600 ~/.ssh/readonly_key # 개인키 (본인만 읽기)
chmod 644 ~/.ssh/readonly_key.pub # 공개키 (서버에 등록할 것)
# 이 내용을 서버에 등록해야 함
cat ~/.ssh/readonly_key.pub
# 출력 예: ssh-ed25519 AAAA...긴문자열... readonly_user@myserver
# 비밀번호 추가/변경
ssh-keygen -p -f ~/.ssh/readonly_key
# 비밀번호 제거
ssh-keygen -p -f ~/.ssh/readonly_key -N ""
EC2 서버에 SSH 접속 후 실행 (ubuntu 계정 등 sudo 권한 있는 계정으로)
sudo mkdir -p /home/readonly_user/.ssh
sudo chmod 700 /home/readonly_user/.ssh
방법 A: 직접 입력
# 클라이언트에서 복사한 공개키를 붙여넣기
sudo vi /home/readonly_user/.ssh/authorized_keys
방법 B: echo로 추가
# 공개키 문자열을 직접 추가 (클라이언트에서 cat으로 확인한 내용)
echo "ssh-ed25519 AAAA...공개키내용... readonly_user@myserver" | \
sudo tee /home/readonly_user/.ssh/authorized_keys
방법 C: ssh-copy-id 사용 (클라이언트에서)
# 비밀번호 인증이 가능한 경우 가장 간편
ssh-copy-id -i ~/.ssh/readonly_key.pub readonly_user@<EC2_IP>
sudo chown -R readonly_user:readonly_user /home/readonly_user/.ssh
sudo chmod 600 /home/readonly_user/.ssh/authorized_keys
ssh -i ~/.ssh/readonly_key readonly_user@<EC2_IP>
문제 해결:
# 상세 로그 확인
ssh -v -i ~/.ssh/readonly_key readonly_user@<EC2_IP>
# 서버 측 로그 확인 (EC2에서)
sudo tail -f /var/log/auth.log
✅ SSH 접속이 확인되면 아래 ACL 설정으로 읽기 전용 권한을 부여
기본 UGO 권한은 파일당 1개 그룹만 허용 → ACL로 다중 사용자/그룹 권한 설정 가능
sudo apt install acl -y
| 명령어 | 설명 |
|---|---|
setfacl -m u:user:rx dir | 사용자 권한 추가 |
setfacl -m g:group:rwx dir | 그룹 권한 추가 |
setfacl -R -m ... | 재귀 적용 |
setfacl -d -m ... | 새 파일 기본값 (default) |
setfacl -x u:user dir | 특정 ACL 제거 |
setfacl -b dir | 모든 ACL 제거 |
getfacl dir | ACL 확인 |
# 읽기 전용
setfacl -R -m u:readonly_user:rx /home/ubuntu
setfacl -R -d -m u:readonly_user:rx /home/ubuntu
# 그룹별 다른 권한
setfacl -R -m g:monitoring:rx /var/log/myapp
setfacl -R -m g:admin:rwx /var/log/myapp
# 기타 사용자 차단
setfacl -m o::--- /var/log/myapp
sudo ln -s /home/ubuntu/dev/readonly_dir /home/readonly_user/readonly_dir
sudo chown -h readonly_user:readonly_user /home/readonly_user/readonly_dir
ls -la
drwxr-x---+ 4 ubuntu ubuntu 4096 dir
^
+ = ACL 설정됨
getfacl /home/ubuntu
# 백업
getfacl -R /path > acl_backup.txt
# 복원
setfacl --restore=acl_backup.txt
# 복사 시 ACL 보존
cp -a src dest
rsync -aX src dest
tar --acls -czf backup.tar.gz path
| 단계 | 위치 | 명령어 |
|---|---|---|
| 1. 계정 생성 | EC2 | sudo adduser readonly_user |
| 2. SSH 키 생성 | 로컬 | ssh-keygen -t ed25519 -f ~/.ssh/readonly_key |
| 3. 공개키 등록 | EC2 | authorized_keys에 공개키 추가 |
| 4. 접속 테스트 | 로컬 | ssh -i ~/.ssh/readonly_key readonly_user@IP |
| 5. ACL 설정 | EC2 | setfacl -R -m u:readonly_user:rx /path |
계정 제한이 올바르게 설정되었는지 확인하는 방법
# 계정 정보
whoami && id
# 쉘 확인
echo $SHELL
cat /etc/passwd | grep <username>
# sudo 권한
sudo -l
# 시스템 파일
cat /etc/shadow # 차단되어야 함
# 다른 사용자 홈
ls /home/ubuntu # 차단되어야 함
# ACL 확인
getfacl /path/to/directory
| 항목 | 상태 |
|---|---|
/etc/shadow | ❌ Permission denied |
/home/ubuntu | ❌ Permission denied |
| sudo 권한 | ❌ 없음 |
| 지정 디렉토리 (ACL) | ✅ rwx 가능 |
사용자별 PM2는 격리됨 → sudoers로 다른 사용자의 PM2 접근 허용
# 각 사용자별 별도 PM2 데몬 실행
ps aux | grep pm2
# 다른 사용자 PM2 접근 시도 → 실패
PM2_HOME=/home/ubuntu/.pm2 pm2 list
# [PM2][ERROR] Permission denied
sudo visudo -f /etc/sudoers.d/front_all_pm2
# 모든 pm2 명령 허용
front_all ALL=(ubuntu) NOPASSWD: /home/ubuntu/.nvm/versions/node/v22.21.1/bin/pm2 *
# 또는 특정 명령만 허용
front_all ALL=(ubuntu) NOPASSWD: /home/ubuntu/.nvm/versions/node/v22.21.1/bin/pm2 list
front_all ALL=(ubuntu) NOPASSWD: /home/ubuntu/.nvm/versions/node/v22.21.1/bin/pm2 restart *
front_all ALL=(ubuntu) NOPASSWD: /home/ubuntu/.nvm/versions/node/v22.21.1/bin/pm2 logs *
# ubuntu가 front_all의 .bashrc에 추가
echo "alias pm2='sudo -u ubuntu /home/ubuntu/.nvm/versions/node/v22.21.1/bin/pm2'" | sudo tee -a /home/front_all/.bashrc
pm2 list # alias 적용 시
pm2 restart web
pm2 logs