본문으로 건너뛰기

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

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


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

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

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

▶️ 해결 방법

정보

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

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

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

Get instance OpenAPI를 사용하여 인스턴스 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 OpenAPI를 통해 생성할 수 있습니다.

이미지 생성 시 주의 사항

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

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

    base64 < kaypair-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 OpenAPI를 사용합니다.

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 인증을 변경할 때는 두 위치의 설정을 모두 확인하고 수정해야 합니다.