비밀번호 인증 실패 시 접속 복구
본 문서는 비밀번호 기반 SSH 인증 문제와 관련된 주요 문제와 해결 방법을 정리한 문서입니다.
비밀번호 분실로 인한 SSH 접속 불가
리눅스 인스턴스에서 키페어가 아닌 비밀번호 기반 로그인을 설정한 경우, 계정의 비밀번호를 분실하면 SSH 접속이 불가능해집니다. 해당 인스턴스에 직접 접속할 수 없기 때문에, 신규 인스턴스를 생성하고 사용자 스크립트를 활용해 접근 권한을 복구하는 절차가 필요합니다.
Permission denied (password).
▶️ 해결 방법
이 가이드는 OpenAPI를 기반으로 설명하며, 동일한 작업은 카카오클라우드 콘솔에서도 수행할 수 있습니다. OpenAPI 사용을 위해서는 먼저 OpenAPI 시작하기 문서의 사전 준비 절차를 완료하세요.
OpenAPI와 사용자 스크립트를 활용해 SSH 접속이 불가능한 인스턴스를 복구하는 전 과정을 5단계로 설명합니다.
각 단계에는 목적, 요구 파라미터, 요청/응답 예시, 설정 값, 주의 사항을 포함했으며, 실제 실행 시에는 사용자 환경에 맞게 값을 변경해 적용하시기 바랍니다.
Step 1. 기존 인스턴스 정보 확인
Get instance OpenAPI를 사용하여 인스턴스 ID, 루트 볼륨 ID, 인스턴스 유형, 보안 그룹, 키페어 등을 확인합니다.
Request
curl -X GET 'https://bcs.kr-central-2.kakaocloud.com/api/v1/instances/${INSTANCE_ID}' \
-H 'Accept: application/json' \
-H 'X-Auth-Token: ${API_TOKEN}'
변수 | 설명 |
---|---|
INSTANCE_ID🖌︎ | 기존 인스턴스 ID |
API_TOKEN🖌︎ | API 인증 토큰 |
Response로 가져올 정보
정보 | Response Body 항목 |
---|---|
인스턴스 ID | instance.id |
루트 볼륨 ID | instance_attached_volume.is_root=true 인 볼륨의 instance.attached_volumes.id 값 확인 |
루트 볼륨 크기 | instance_attached_volume.is_root=true 인 볼륨의 instance.attached_volumes.size 값 확인 |
인스턴스 유형 ID | instance.flavor.id |
보안그룹 이름 | instance.security_groups.name |
키페어 이름 | instance.key_name |
가용 영역 | instance.availability_zone |
Step 2. 인스턴스의 이미지 생성
이미지는 Create image OpenAPI를 통해 생성할 수 있습니다.
실행 중인 인스턴스에서 이미지를 생성하면, 메모리에 저장된 데이터가 볼륨에 완전히 기록되지 않아 일부 데이터의 일관성이 손상될 수 있습니다.
따라서 이미지 생성 전 인스턴스를 정지하는 것을 권장합니다.
Request
curl -X POST 'https://volume.kr-central-2.kakaocloud.com/api/v1/volumes/$(ROOT_VOLUME_ID:1번 항목에서 조회된 루트 볼륨 ID)/image' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'X-Auth-Token: ${API_TOKEN}' \
-d '{
"image": {
"name": "${IMAGE_NAME}",
"description": "${IMAGE_DESC}"
}
}'
변수 | 설명 |
---|---|
API_TOKEN🖌︎ | API 인증 토큰 |
IMAGE_NAME🖌︎ | 이미지 이름 |
IMAGE_DESC🖌︎ | 이미지 설명 |
Response로 가져올 정보
정보 | Response Body 항목 |
---|---|
이미지 ID | image.id |
Step 3. 사용자 스크립트 작성
비밀번호 분실 등으로 SSH 접속이 불가할 경우, 신규 인스턴스를 생성할 때 사용자 스크립트(user_data)를 활용해 SSH 접속이 가능한 환경을 구성할 수 있습니다.
사용자 스크립트는 인스턴스 최초 부팅 시 실행되며, Base64 인코딩된 문자열로 전달해야 합니다. 최대 크기는 16KB입니다.
문제 해결 방식은 다음 중 하나를 선택하여 적용할 수 있습니다. 문제가 발생한 인스턴스의 운영체제에 맞는 방법과 스크립트를 선택하여 접속이 가능하도록 복구합니다.
방법 1: 키페어를 이용한 접속이 가능하도록 설정 변경
sshd_config
파일을 수정해 PubkeyAuthentication
을 활성화하고 SSH 데몬을 재시작합니다.
- CentOS, Rocky, Alma
- Ubuntu
-
아래 셸 스크립트 파일(kaypair-setting.sh)을 로컬 환경에 작성하여 저장합니다.
kaypair-setting.sh#!/bin/bash
CONFIG_FILE="/etc/ssh/sshd_config"
BACKUP_FILE="/etc/ssh/sshd_config.bak"
# 백업
cp "$CONFIG_FILE" "$BACKUP_FILE"
# PubkeyAuthentication 항목이 있는 경우 → yes로 변경
if grep -qE '^[[:space:]]*PubkeyAuthentication[[:space:]]+' "$CONFIG_FILE"; then
sed -i 's/^[[:space:]]*PubkeyAuthentication[[:space:]]\+.*/PubkeyAuthentication yes/' "$CONFIG_FILE"
echo "✔ 기존 PubkeyAuthentication 항목을 yes로 변경했습니다."
else
echo "PubkeyAuthentication yes" >> "$CONFIG_FILE"
echo "✔ PubkeyAuthentication 항목이 없어 새로 추가했습니다."
fi
# sshd 재시작
echo "🔁 sshd 서비스 재시작 중..."
sudo systemctl restart sshd
echo "✅ 설정 완료 및 ssh 재시작 완료 (백업: $BACKUP_FILE)" -
생성한 셸 스크립트(kaypair-setting.sh)를 Base64 형식으로 인코딩하여, 출력되는 값을 메모합니다.
base64 < kaypair-setting.sh | tr -d '\n'
# IyEvYmluL2Jhc2gKCkNPTkZJR19GSUxFP... 로 출력되는 값 메모 필요
-
아래 셸 스크립트 파일(kaypair-setting.sh)을 로컬 환경에 작성하여 저장합니다.
kaypair-setting.sh#!/bin/bash
CONFIG_FILE="/etc/ssh/sshd_config"
BACKUP_FILE="/etc/ssh/sshd_config.bak"
# 백업
cp "$CONFIG_FILE" "$BACKUP_FILE"
# PubkeyAuthentication 항목이 있는 경우 → yes로 변경
if grep -qE '^[[:space:]]*PubkeyAuthentication[[:space:]]+' "$CONFIG_FILE"; then
sed -i 's/^[[:space:]]*PubkeyAuthentication[[:space:]]\+.*/PubkeyAuthentication yes/' "$CONFIG_FILE"
echo "✔ 기존 PubkeyAuthentication 항목을 yes로 변경했습니다."
else
echo "PubkeyAuthentication yes" >> "$CONFIG_FILE"
echo "✔ PubkeyAuthentication 항목이 없어 새로 추가했습니다."
fi
# sshd 재시작
echo "🔁 sshd 서비스 재시작 중..."
sudo systemctl restart ssh
echo "✅ 설정 완료 및 ssh 재시작 완료 (백업: $BACKUP_FILE)" -
생성한 셸 스크립트(kaypair-setting.sh)를 Base64 형식으로 인코딩하여, 출력되는 값을 메모합니다.
base64 < kaypair-setting.sh | tr -d '\n'
# IyEvYmluL2Jhc2gKCkNPTkZJR19GSUxFP... 로 출력되는 값 메모 필요
방법 2: 계정의 신규 비밀번호 세팅
계정 비밀번호를 초기화하고, 비밀번호 인증을 허용하도록 SSH 설정을 변경합니다.
- CentOS, Rocky, Alma
- Ubuntu
-
아래 셸 스크립트 파일(passwd-setting.sh)을 로컬 환경에 작성하여 저장합니다.
passwd-setting.sh#!/bin/bash
# 기존 사용자 이름과 초기 비밀번호
USERNAME="centos"
PASSWORD="InitPassword123!"
# 1. 사용자 존재 여부 확인 및 비밀번호 초기화
if id "$USERNAME" &>/dev/null; then
echo "$USERNAME:$PASSWORD" | sudo chpasswd
echo "✅ 사용자 '$USERNAME'의 비밀번호가 성공적으로 초기화되었습니다."
else
echo "❌ 사용자 '$USERNAME'는 존재하지 않습니다."
fi
# 2. PasswordAuthentication 설정 수정 (/etc/ssh/sshd_config.d/50-cloud-init.conf)
CONF_FILE="/etc/ssh/sshd_config.d/50-cloud-init.conf"
if [ -f "$CONF_FILE" ]; then
sed -i 's/^PasswordAuthentication\s\+no/PasswordAuthentication yes/' "$CONF_FILE"
echo "🔧 '$CONF_FILE' 파일의 PasswordAuthentication 설정을 yes로 변경했습니다."
else
echo "⚠ '$CONF_FILE' 파일이 존재하지 않아 수정하지 못했습니다."
fi
# 3. SSHD 서비스 재시작
echo "🔁 SSHD 서비스를 재시작합니다..."
sudo systemctl restart sshd
echo "🎉 작업 완료!" -
생성한 셸 스크립트(passwd-setting.sh)를 Base64 형식으로 인코딩하여, 출력되는 값을 메모합니다.
base64 < passwd-setting.sh | tr -d '\n'
# IyEvYmluL2Jhc2gKCkNPTkZJR19GSUxFP... 로 출력되는 값 메모 필요
-
아래 셸 스크립트 파일(passwd-setting.sh)을 로컬 환경에 작성하여 저장합니다.
passwd-setting.sh#!/bin/bash
# 기존 사용자 이름과 초기 비밀번호
USERNAME="ubuntu"
PASSWORD="InitPassword123!"
# 사용자 존재 여부 확인
if id "$USERNAME" &>/dev/null; then
echo "$USERNAME:$PASSWORD" | sudo chpasswd
echo "✅ 사용자 '$USERNAME'의 비밀번호가 성공적으로 초기화되었습니다."
else
echo "❌ 사용자 '$USERNAME'는 존재하지 않습니다."
fi -
생성한 셸 스크립트(passwd-setting.sh)를 Base64 형식으로 인코딩하여, 출력되는 값을 메모합니다.
base64 < passwd-setting.sh | tr -d '\n'
# IyEvYmluL2Jhc2gKCkNPTkZJR19GSUxFP... 로 출력되는 값 메모 필요
Step 4. 이미지 기반 신규 인스턴스 생성
생성한 이미지와 사용자 스크립트를 이용해 신규 인스턴스를 생성합니다. 인스턴스 생성은 Create instance OpenAPI를 사용합니다.
Request
curl -X POST 'https://bcs.kr-central-2.kakaocloud.com/api/v1/instances' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'X-Auth-Token: ${API_TOKEN}' \
-d '{
"instance": {
"name": "${INSTANCE_ID}",
"description": "${INSTANCE_DESC}",
"count": 1,
"image_id": "${IMAGE_ID}",
"flavor_id": "${FLAVOR_ID}",
"availability_zone": "${AZ}",
"subnets": [
{
"id": "${SUBNET_ID}"
}
],
"volumes": [
{
"is_delete_on_termination": true,
"size": ${VOLUME_SIZE},
"source_type": "image",
"uuid": "${IMAGE_ID}",
"type_id": "${VOLUME_TYPE_ID}"
}
],
"key_name": "${KEY_NAME}",
"security_groups": [
{
"name": "${SG_NAME}"
}
],
"user_data": "${BASE_64}"
}
}'
변수 | 설명 |
---|---|
API_TOKEN🖌︎ | API 인증 토큰 |
INSTANCE_ID🖌︎ | 신규 인스턴스 이름 |
INSTANCE_DESC🖌︎ | 인스턴스 설명 |
IMAGE_ID🖌︎ | 2번 항목에서 생성한 이미지 ID |
FLAVOR_ID🖌︎ | 인스턴스 유형 ID |
AZ🖌︎ | 인스턴스를 생성할 가용영역 |
SUBNET_ID🖌︎ | 서브넷 ID |
VOLUME_SIZE🖌︎ | 볼륨 사이즈, 기존 인스턴스의 루트 볼륨 사이즈와 동일하게 설정 |
VOLUME_TYPE_ID🖌︎ | 볼륨 타입 ID |
KEY_NAME🖌︎ | 키페어 이름 |
SG_NAME🖌︎ | 보안그룹 이름 |
BASE_64🖌︎ | 작성한 스크립트의 BASE 64 형식 값 |
- 서브넷 ID 조회: List subnets OpenAPI
- 볼륨 타입 ID 조회: List volume types OpenAPI
Step 5. 신규 인스턴스의 SSH 접속 확인
신규 인스턴스 부팅 완료 후, SSH 접속을 시도해 정상 여부를 확인합니다.
# 키페어 기반 설정 시
ssh -i ${pem-key-file} ${username}@${server-ip}
# 비밀번호 초기화 설정 시
ssh ${username}@${server-ip}
비밀번호 기반 SSH 설정 불가
PasswordAuthentication
을 활성화했음에도 비밀번호 기반 SSH 인증이 동작하지 않을 수 있습니다.
이는 비밀번호 인증 허용 여부를 결정하는 PasswordAuthentication
설정이 /etc/ssh/sshd_config
파일보다 /etc/ssh/sshd_config.d/
디렉터리 내 설정 파일에 우선 적용되기 때문입니다.
따라서 비밀번호 기반 SSH 인증을 변경할 때는 두 위치의 설정을 모두 확인하고 수정해야 합니다.