AWS EC2 Permission Denied 문제, 인스턴스 복구로 대처하기
Permission Denied 문제는 여러 상황에서 발생한다.
접근할 때 비밀번호를 잘못 입력했거나, 권한이 없는 폴더나 파일에 수정을 한다던지 말이다.
인스턴스 접근 권한을 부여할 방법이 없는데
접근 권한을 요구하는 경우에는 어떻게 대처해야 할까?
아래 내용은
EC2 인스턴스 내에서 권한 설정을 잘못 건들였을 때,
복구하는 방법에 대해서 설명한다.
비상상태 발생
새벽에 서버 업데이트를 하다가 리눅스 권한 설정(sshd.config 파일)을 잘못 설정하는 바람에
EC2 인스턴스에 어떤 방법으로도 접근조차 못하는 비상 사태가 발생했다.
AllowUsers unbuntu // 이렇게 했어야 했는데
AllowUsers unbuntus // 대충 이렇게 설정하고 저장했다.
정말 딱 하나 오타낸 실수인데 기존 EC2 인스턴스에 접근할 수가 없게 되버렸다.
친절하게도 AWS에서 해결 방법을 찾아볼 수 있었는데 그 방법을 공유하고자 한다.
가장 먼저 복구할 EC2 인스턴스를 A 인스턴스라고 칭하고,
복구를 위해 잠시 생성할 EC2 인스턴스를 B 인스턴스라고 하겠다.
일단 전반적인 작업은 아래와 같다.
A 인스턴스에 연결된 볼륨을 빼내고
B 인스턴스에 연결하여 A 인스턴스에서 빼낸 볼륨을 수정하고
다시 B 인스턴스의 볼륨에서 빼내 A 인스턴스에 집어넣어 복구한다.
1. A 인스턴스와 같은 VPC ID, 서브넷 ID를 가진 새 인스턴스 B를 생성해야 한다.
이 때 최대한 A 인스턴스와 B 인스턴스의 사양은 동일하게 만들어주는 게 바람직하다.
특히 VPC ID, 서브넷 ID를 동일하게 만들어주는 게 핵심이고 반드시 리전(지역)이 동일해야 한다.
하나라도 동일하지 않으면 볼륨 연결에 어려움이 있다.
어차피 새로 만드는 B 인스턴스는 이 복구 작업이 끝나면 어떻게 처리하든 상관없다.
용량이 많을 필요는 없지만 안전성과 부팅을 위해 최소 8GB, 그 이상은 필요없다.
2. A 인스턴스 중지(다시 시작할 거니 무조건 중지! 종료하면 안된다.), 볼륨을 분해하고 새 인스턴스 B에 할당한다.
새 인스턴스 B를 생성했다면 Elastic Block Store 탭에 볼륨으로 들어가서 A 인스턴스에 부착된 볼륨을 분리한다.
우클릭하거나 작업 목록을 선택하여 볼륨 분리를 선택하면 된다.
볼륨 분리가 정상적으로 완료되면 다시 볼륨 연결을 선택하여 새로 만든 인스턴스 B에 부착하면 된다.
이 때 할당할 때 나오는 볼륨 경로를 지정하는 게 중요한데 반드시 연결할 볼륨을 보조 경로로 설정한다.
B 인스턴스를 생성할 때 만들어진 루트 볼륨(별도 설정 없을 시 자동 생성)으로 정상적인 부팅을 해야 하기 때문이다.
별도로 건들이거나 수정이 없었던 경우에는 따로 설정이 필요하지 않는다.
3. B 인스턴스에 접근하여 망가진 볼륨을 마운트 시키고 문제를 수정한다.
SSH 등을 이용하여 B 인스턴스에 접근하고 명령어 lsblk을 입력하여 현재의 블록 장치 목록을 확인한다.
블록 장치에서 연결된 새 볼륨이 보일 경우 정상적으로 연결된 것이며 아래와 같이 명령어를 입력한다.
주의, 새 볼륨의 이름이 xvdf1인지 확인한다.
아래의 명령어에는 볼륨이 xvdf1 이름을 가지고 있다는 전제하에 작성되어 있으니,
새 볼륨의 이름이 다르다면! 반드시 그 이름에 맞게 수정해야 한다.
// 복구할 새 볼륨의 마운트 포인트 폴더를 생성
sudo mkdir /mnt/rescue
// 볼륨 마운트(아래중 하나만 입력)
sudo mount -t xfs -o nouuid /dev/xvdf1/mnt/rescue // 보통의 경우
sudo mount /dev/xvdf1/mnt/rescue // ext3, ex4 파일 시스템을 사용중인 경우
// 문제의 파일 해결(아래중 해결 방법 하나 선택)
sudo vi /mnt/rescue/etc/ssh/sshd_config // 직접 수정하는 경우
sudo cp /etc/ssh/sshd_config /mnt/rescue/etc/ssh/sshd_config // 새 파일로 대체하는 경우
// 마운트 해제
sudo umount /mnt/rescue // 볼륨 마운트 해제
4. 다시 B 인스턴스에서 볼륨을 분리하고 A 인스턴스에 연결, 인스턴스 시작을 진행한다.
Elastic Block Store 탭의 볼륨에서 기존 A 인스턴스의 볼륨이 현재는 B 인스턴스에 연결되어 있는데 이를 다시 분리하고 A 인스턴스에 연결한다.
이후 A 인스턴스를 인스턴스 시작을 누르고 SSH 접근이 이상없이 잘 되는지 확인한다.
최대한 아는 대로 정리했지만 본문을 보고도 잘 모르겠다면,
더 자세히 작성되어 있는 맨 아래 출처에 접속하여 문제를 해결하면 된다.
Good Luck ☘
출처: https://repost.aws/ko/knowledge-center/ec2-troubleshoot-sshd-config-edits