EC2를 처음 세팅해서 애플리케이션을 서버에 배포하려고 할 때, port22를 통해 SSH로 인스턴스에 접속해서 세팅해줘야 할 것들이 많다. (환경변수, docker포트 설정 등)
원격 호스트에 접속하기 위해 사용되는 보안 프로토콜
이 보안 프로토콜을 통해 서버에 원격으로 접속해서 직접 파일을 수정하거나, git으로 소스를 관리할 수도 있습니다. 저는 소스를 git에서 바로 CI/CD로 배포하고, 보안상 git으로 배포하지 못하는 환경변수는 SSH로 설정하는 간단한 방식의 관리를 택했다.
그런데 이 SSH 자체가 접속이 안될 때가 있다.
SSH와 연결이 되다가 몇시간 정도 지나면 끊기는데, 재로그인 하려고 할 때 아래와 같은 로그가 뜨고 멈춘상태로 지속되면서 결국 로그인이 안되는 현상이 있었다.
debug1: Authenticator provider $SSH_SK_PROVIDER did not resolve; disabling
debug3: ssh_connect_direct: entering debug1: Connecting to (내 인스턴스 주소) port 22.
debug3: set_sock_tos: set socket 3 IP_TOS 0x48 debug1: Connection established.
debug1: identity file (키페어파일).pem type -1
debug1: identity file (키페어파일).pem-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_9.0
Connection established. ✅ 서버 TCP 연결까지는 성공
identity file ... type -1 ⚠️ 키 인식 안 됨
=> EC2랑 네트워크 연결은 되는데 SSH 키 인증을 못 해서 다음 단계로 못 넘어가고 있는 상황
SSH로그인이 안되는 다음과 같은 원인이 있을 수 있다.
.pem 파일이 EC2 생성할 때 지정한 Key Pair랑 다른 경우
-i (내 키페어).pem 경로/파일명 불일치
또는 chmod 400 (내 키페어).pem 안 해둔 경우
접속자명은 인스턴스를 생성할 때 지정한 OS타입별로 아래와 같아야한다. 나같은 경우 Ubuntu 22.04를 사용했기 때문에 ubuntu여야 한다.
Ubuntu AMI → ubuntu
Amazon Linux → ec2-user
RHEL → ec2-user 또는 centos
ssh -i (내 키페어 명).pem ubuntu@(접속주소)
처럼 사용자명 맞춰야 함
Mac에서 .pem 파일이 다른 권한으로 되어 있으면 SSH가 무시합니다.
chmod 400 (내 키페어 명).pem
만약 PermitRootLogin no만 켜고 다른 계정에 SSH 설정 안 해둔 경우 → 로그인 막힐 수 있음
결론적으로는 Mac에서 키 권한 문제였고 로컬에서 보관하고 있는 키페어의 권한을 허용해주자 해결되었다.(여태 원인을 알 수 없는 버그는 Mac자체에서 보안 관련으로 허용을 안해줘서 나는 문제가 많았던것 같다...)
그런데 SSH에 접속하지 않아도 인스턴스에 접근할 수 있는 방법이 있다. 바로 AWS콘솔에서 Session Manager를 사용해서 브라우저 기반 셸을 통해 EC2 인스턴스에 접속하는 것이다. (SSH 키나 보안 그룹 설정 없이도 인스턴스에 연결 가능)
1단계: AWS 콘솔 로그인
AWS Management Console에 로그인하고 내 EC2가 있는 리전을 선택
2단계: Session Manager 접근 방법
방법 1: EC2 콘솔을 통한 접근
EC2 콘솔로 이동-> 왼쪽 메뉴에서 "인스턴스"를 클릭->접속하고자 하는 인스턴스를 선택->상단의 "연결" 버튼을 클릭->"Session Manager" 탭을 선택->"연결" 버튼을 클릭
방법 2: Systems Manager 콘솔을 통한 접근
AWS 콘솔에서 "Systems Manager"를 검색하여 접속->
->왼쪽 메뉴에서 "세션 관리자"를 클릭->"세션 시작" 버튼을 클릭->대상 인스턴스를 선택->"세션 시작" 버튼을 클릭
3단계: 세션 연결
새로운 브라우저 탭 또는 창이 열리며 터미널 인터페이스가 표시됩니다.
리눅스의 경우 sh-4.2$ 또는 유사한 프롬프트가 나타납니다.
Windows의 경우 PowerShell 프롬프트가 나타납니다.
필수 관리형 정책 1개
AmazonSSMManagedInstanceCore
또는 사용자 정의 최소 권한
json{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:UpdateInstanceInformation",
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
json{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:StartSession",
"ssm:TerminateSession"
],
"Resource": ""
},
{
"Effect": "Allow",
"Action": [
"ssm:DescribeInstanceInformation",
"ec2:DescribeInstances"
],
"Resource": ""
}
]
}
적용 방법
인스턴스 역할:
IAM → 역할 생성 → EC2 선택
AmazonSSMManagedInstanceCore 정책 검색해서 연결
EC2 인스턴스에 역할 연결
사용자 권한:
IAM → 정책 생성
위 JSON 정책 적용
사용자/그룹에 정책 연결
이것만으로 Session Manager 기본 접속이 가능
이렇게 SSH또는 Session Manager 어느쪽으로든 접속해서 서버의 상태나 접속이 안되는 원인, 에러 로그등을 확인하고 조치할 수 있다.