읽기 전용 계정 + ACL 설정

이건선·2025년 12월 29일

해결

목록 보기
51/59

기본 권한 (UGO)

-rw-r--r--  1 ubuntu ubuntu  file.txt
 │││││││││
 │││││││└┴─ Other: r-- (읽기)
 ││││└┴┴─── Group: r-- (읽기)
 │└┴┴────── User: rw- (읽기+쓰기)
 └───────── 타입 (-:파일, d:디렉토리)

제약: 파일당 1개 그룹만 지정 가능 → ACL로 해결


읽기 전용 계정 설정

전체 흐름: 계정 생성(서버)SSH 키 생성(클라이언트)공개키 등록(서버)접속 테스트

Step 1. 계정 생성 (EC2 서버)

# EC2 서버에서 실행
sudo adduser readonly_user

Step 2. SSH 키 생성 (클라이언트)

접속할 로컬 머신에서 실행

키 생성

# 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 ""

Step 3. 공개키 등록 (EC2 서버)

EC2 서버에 SSH 접속 후 실행 (ubuntu 계정 등 sudo 권한 있는 계정으로)

3-1. .ssh 디렉토리 생성

sudo mkdir -p /home/readonly_user/.ssh
sudo chmod 700 /home/readonly_user/.ssh

3-2. 공개키 등록

방법 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>

3-3. 소유자 및 권한 설정

sudo chown -R readonly_user:readonly_user /home/readonly_user/.ssh
sudo chmod 600 /home/readonly_user/.ssh/authorized_keys

Step 4. 접속 확인 (클라이언트)

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 설정으로 읽기 전용 권한을 부여


Step 5. ACL로 읽기 권한 부여 (EC2 서버)

기본 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 dirACL 확인

설정 예시

# 읽기 전용
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

(참고) ACL 백업/복원

# 백업
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. 계정 생성EC2sudo adduser readonly_user
2. SSH 키 생성로컬ssh-keygen -t ed25519 -f ~/.ssh/readonly_key
3. 공개키 등록EC2authorized_keys에 공개키 추가
4. 접속 테스트로컬ssh -i ~/.ssh/readonly_key readonly_user@IP
5. ACL 설정EC2setfacl -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

예상 결과 (front_all 계정)

항목상태
/etc/shadow❌ Permission denied
/home/ubuntu❌ Permission denied
sudo 권한❌ 없음
지정 디렉토리 (ACL)✅ rwx 가능

PM2 권한 공유 (sudoers)

사용자별 PM2는 격리됨 → sudoers로 다른 사용자의 PM2 접근 허용

PM2 격리 확인

# 각 사용자별 별도 PM2 데몬 실행
ps aux | grep pm2

# 다른 사용자 PM2 접근 시도 → 실패
PM2_HOME=/home/ubuntu/.pm2 pm2 list
# [PM2][ERROR] Permission denied

sudoers 설정 (ubuntu에서)

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 *

Alias 설정

# 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

사용법 (front_all에서)

pm2 list        # alias 적용 시
pm2 restart web
pm2 logs
profile
멋지게 기록하자

0개의 댓글