본문으로 건너뛰기

비밀번호 인증 실패 시 접속 복구

본 문서는 비밀번호 기반 SSH 인증 문제와 관련된 주요 문제와 해결 방법을 정리한 문서입니다.


비밀번호 분실로 인한 SSH 접속 불가​

Linux 계열 운영 체제의 이미지로 생성한 인스턴스에서 키 페어가 아닌 비밀번호 기반 로그인을 설정한 경우, 계정의 비밀번호를 분실하면 SSH 접속이 불가능해집니다. 해당 인스턴스에 직접 접속할 수 없으므로 신규 인스턴스를 생성하고 사용자 스크립트를 활용해 접근 권한을 복구하는 절차가 필요합니다.

오류 메시지 예시
Permission denied (password).

▶️ 해결 방법​

정보

이 가이드는 OpenAPI를 기반으로 설명하며, 동일한 작업은 카카오클라우드 콘솔에서도 수행할 수 있습니다. OpenAPI 사용을 위해서는 먼저 OpenAPI 시작하기 문서의 사전 준비 절차를 완료하세요.

OpenAPI와 사용자 스크립트를 활용해 SSH 접속이 불가능한 인스턴스를 복구하는 전 과정을 5단계로 설명합니다.
각 단계에는 목적, 요구 파라미터, 요청/응답 예시, 설정 값, 주의 사항을 포함했으며, 실제 실행 시에는 사용자 환경에 맞게 값을 변경해 적용하시기 바랍니다.

Step 1. 기존 인스턴스 정보 확인​

Get instance API를 사용하여 인스턴스 ID, 루트 볼륨 ID, 인스턴스 유형, 보안 그룹, 키 페어 등을 확인합니다.

Request​

Get instance Request Syntax
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
루트 볼륨 IDinstance_attached_volume.is_root=true인 볼륨의 instance.attached_volumes.id 값 확인
루트 볼륨 크기instance_attached_volume.is_root=true인 볼륨의 instance.attached_volumes.size 값 확인
인스턴스 유형 IDinstance.flavor.id
보안 그룹 이름instance.security_groups.name
키 페어 이름instance.key_name
가용 영역instance.availability_zone

Step 2. 인스턴스의 이미지 생성​

이미지는 Create image API를 통해 생성할 수 있습니다.

이미지 생성 시 주의 사항

실행 중인 인스턴스에서 이미지를 생성하면, 메모리에 저장된 데이터가 볼륨에 완전히 기록되지 않아 일부 데이터의 일관성이 손상될 수 있습니다.
따라서 이미지 생성 전 인스턴스를 정지하는 것을 권장합니다.

Request​

Create image Request Syntax
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 항목
이미지 IDimage.id

Step 3. 사용자 스크립트 작성​

비밀번호 분실 등으로 SSH 접속이 불가할 경우, 신규 인스턴스를 생성할 때 사용자 스크립트(user_data)를 활용해 SSH 접속이 가능한 환경을 구성할 수 있습니다.

사용자 스크립트는 인스턴스 최초 부팅 시 실행되며, Base64 인코딩된 문자열로 전달해야 합니다. 최대 크기는 16KB입니다.

문제 해결 방식은 다음 중 하나를 선택하여 적용할 수 있습니다. 문제가 발생한 인스턴스의 운영 체제에 맞는 방법과 스크립트를 선택하여 접속이 가능하도록 복구합니다.

방법 1: 키 페어를 사용한 접속이 가능하도록 설정 변경

sshd_config 파일을 수정해 PubkeyAuthentication을 활성화하고 SSH 데몬을 재시작합니다.

  1. 아래 셸 스크립트 파일(keypair-setting.sh)을 로컬 환경에 작성하여 저장합니다.

    keypair-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)"
  2. 생성한 셸 스크립트(keypair-setting.sh)를 Base64 형식으로 인코딩하여, 출력되는 값을 메모합니다.

    base64 < keypair-setting.sh | tr -d '\n'
    # IyEvYmluL2Jhc2gKCkNPTkZJR19GSUxFP... 로 출력되는 값 메모 필요
방법 2: 계정의 신규 비밀번호 세팅

계정 비밀번호를 초기화하고, 비밀번호 인증을 허용하도록 SSH 설정을 변경합니다.

  1. 아래 셸 스크립트 파일(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 "🎉 작업 완료!"
  2. 생성한 셸 스크립트(passwd-setting.sh)를 Base64 형식으로 인코딩하여, 출력되는 값을 메모합니다.

    base64 < passwd-setting.sh | tr -d '\n'
    # IyEvYmluL2Jhc2gKCkNPTkZJR19GSUxFP... 로 출력되는 값 메모 필요

Step 4. 이미지 기반 신규 인스턴스 생성​

생성한 이미지와 사용자 스크립트를 사용해 신규 인스턴스를 생성합니다. 인스턴스 생성은 Create instance API를 사용합니다.

Request​

Create instance Request Syntax
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 형식 값
참고

Step 5. 신규 인스턴스의 SSH 접속 확인​

신규 인스턴스 부팅 완료 후, 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 인증을 변경할 때는 두 위치의 설정을 모두 확인하고 수정해야 합니다.