Docker SSH 설정 시 "호스트 키를 로드할 수 없습니다" 오류 해결 방법

DockerBeginner
지금 연습하기

소개

Docker 는 애플리케이션을 컨테이너화하는 강력한 도구이지만, SSH 를 설정하는 것은 때때로 어려울 수 있습니다. 이 튜토리얼에서는 Docker 컨테이너에 SSH 를 구성할 때 발생하는 "호스트 키를 로드할 수 없습니다" 오류를 해결하는 방법을 살펴보고, 원활하고 안전한 개발 프로세스를 보장합니다.

SSH 및 호스트 키 이해

보안 셸 (SSH) 은 비보안 네트워크를 통해 컴퓨터에 안전하게 통신하고 원격으로 접속하기 위해 널리 사용되는 프로토콜입니다. SSH 는 클라이언트와 서버 간에 교환되는 데이터의 기밀성과 무결성을 보장하기 위해 암호화 및 인증 메커니즘을 제공합니다.

SSH 의 중요한 측면 중 하나는 SSH 연결 설정 과정에서 서버를 식별하는 데 사용되는 암호화 키인 호스트 키입니다. 이러한 호스트 키는 서버의 신원을 확인하여 중간자 공격을 방지하는 데 도움이 됩니다.

SSH 클라이언트가 처음 서버에 연결할 때 서버의 호스트 키를 known_hosts 파일 (예: Linux/macOS의 ~/.ssh/known_hosts, Windows 의 %USERPROFILE%\.ssh\known_hosts) 에 저장합니다. 이 파일은 이후 연결에서 서버의 신원을 확인하는 데 사용됩니다. 호스트 키가 변경되면 SSH 클라이언트는 "호스트 키를 로드할 수 없습니다" 오류를 발생시켜 잠재적인 보안 위험을 나타냅니다.

sequenceDiagram participant Client participant Server Client->>Server: SSH 연결 요청 Server->>Client: 서버의 호스트 키 Client->>Client: known_hosts 파일과 호스트 키 비교 alt 호스트 키 일치 Client->>Server: 안전한 연결 설정 else 호스트 키 불일치 Client->>Client: "호스트 키를 로드할 수 없습니다" 오류 end

known_hosts 파일은 일반적으로 사용자의 홈 디렉토리 (예: Linux/macOS의 ~/.ssh/known_hosts, Windows 의 %USERPROFILE%\.ssh\known_hosts) 에 있습니다. 이 파일에는 사용자가 과거에 연결했던 모든 서버의 호스트 키가 저장됩니다.

표 1: 일반적인 SSH 호스트 키 알고리즘

알고리즘 설명
RSA Rivest-Shamir-Adleman(RSA) 는 널리 사용되는 공개 키 암호화 알고리즘입니다. RSA 호스트 키는 일반적으로 2048 또는 4096 비트 길이입니다.
ECDSA 타원 곡선 디지털 서명 알고리즘 (ECDSA) 은 타원 곡선 암호화를 사용하여 RSA 보다 효율적인 대안입니다. ECDSA 호스트 키는 일반적으로 256, 384 또는 521 비트 길이입니다.
ED25519 Ed25519 는 타원 곡선 암호화를 기반으로 한 현대적이고 고성능의 공개 키 서명 시스템입니다. Ed25519 호스트 키는 256 비트 길이입니다.

SSH 호스트 키의 역할과 "호스트 키를 로드할 수 없습니다" 오류를 이해하는 것은 SSH 연결에 의존하는 Docker 환경을 안전하게 설정하고 문제를 해결하는 데 필수적입니다.

"호스트 키를 로드할 수 없습니다" 오류 진단

원인 파악

"호스트 키를 로드할 수 없습니다" 오류는 일반적으로 SSH 클라이언트가 known_hosts 파일과 서버의 호스트 키를 확인할 수 없을 때 발생합니다. 이는 여러 가지 이유로 발생할 수 있습니다.

  1. 처음 연결: 처음 새로운 서버에 연결할 때 SSH 클라이언트는 known_hosts 파일에 서버의 호스트 키가 저장되어 있지 않아 오류가 발생합니다.
  2. 호스트 키 변경: 마지막 연결 이후 서버의 호스트 키가 변경된 경우 SSH 클라이언트는 저장된 키와 새로운 키를 비교할 수 없어 "호스트 키를 로드할 수 없습니다" 오류를 발생시킵니다.
  3. known_hosts 파일 손상: known_hosts 파일이 손상되거나 수동으로 수정된 경우 SSH 클라이언트는 서버의 호스트 키를 제대로 확인할 수 없습니다.

문제 해결 단계

  1. known_hosts 파일 확인: known_hosts 파일의 내용을 확인하여 서버의 호스트 키가 존재하고 올바른지 확인합니다. ssh-keygen 명령어를 사용하여 파일 내용을 볼 수 있습니다.

    ssh-keygen -F <server_hostname>

    이 명령어는 지정된 서버 호스트 이름에 대한 known_hosts 파일을 검색하고 관련 호스트 키를 표시합니다.

  2. known_hosts 파일 지우기: 서버의 호스트 키가 변경된 경우 known_hosts 파일에서 이전 항목을 제거할 수 있습니다. 이렇게 하면 SSH 클라이언트가 다음 연결에서 새로운 호스트 키를 허용할 수 있습니다.

    ssh-keygen -R <server_hostname>

    이 명령어는 지정된 서버 호스트 이름에 대한 known_hosts 파일의 모든 항목을 제거합니다.

  3. 호스트 키 수동 추가: 서버의 호스트 키가 known_hosts 파일에 없는 경우 수동으로 추가할 수 있습니다. 먼저 서버의 호스트 키를 가져온 다음 known_hosts 파일에 추가합니다.

    ssh-keyscan -H <server_hostname> >> ~/.ssh/known_hosts

    이 명령어는 서버의 호스트 키를 가져와 known_hosts 파일에 추가합니다.

  4. 호스트 키 확인 비활성화: 마지막 수단으로 호스트 키 확인을 비활성화할 수 있지만, 보안상 권장하지 않습니다. SSH 구성 파일 (예: ~/.ssh/config) 에서 StrictHostKeyChecking 옵션을 no로 설정하여 이를 수행할 수 있습니다.

    Host <server_hostname>
        StrictHostKeyChecking no

이러한 문제 해결 단계를 따르면 "호스트 키를 로드할 수 없습니다" 오류를 해결하고 Docker 환경에 안전한 SSH 연결을 설정할 수 있습니다.

Docker 컨테이너에 SSH 구성

Docker 컨테이너에서 SSH 활성화

Docker 컨테이너에 SSH 접근을 활성화하려면 컨테이너 내부에서 SSH 서버가 설치되고 구성되어 있어야 합니다. Dockerfile 을 사용하여 이를 수행하는 예는 다음과 같습니다.

FROM ubuntu:22.04

## SSH 서버 설치
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd

## SSH 구성
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN echo 'root:password' | chpasswd

## SSH 포트 노출
EXPOSE 22

## SSH 서버 시작
CMD ["/usr/sbin/sshd", "-D"]

이 Dockerfile 은 OpenSSH 서버를 설치하고 SSH 데몬을 위한 필요한 디렉토리 (폴더) 를 생성하며, 루트 로그인을 허용하도록 SSH 서버를 구성하고 루트 비밀번호를 설정하며 SSH 포트 (22) 를 노출합니다. 마지막으로 컨테이너가 실행될 때 SSH 서버를 시작합니다.

SSH 를 통해 Docker 컨테이너 연결

SSH 가 활성화된 Docker 컨테이너에 연결하려면 ssh 명령어를 사용할 수 있습니다.

ssh root@<container_ip_address>

<container_ip_address>를 실제 Docker 컨테이너의 IP 주소 또는 호스트 이름으로 바꿔야 합니다.

"호스트 키를 로드할 수 없습니다" 오류가 발생하면 이전 섹션의 문제 해결 단계를 따르십시오.

Docker Compose 를 사용한 SSH 구성 자동화

애플리케이션 관리에 Docker Compose 를 사용하는 경우 Compose 파일에 필요한 단계를 추가하여 SSH 구성 프로세스를 자동화할 수 있습니다. 예는 다음과 같습니다.

version: "3"
services:
  my-app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "22:22"
    environment:
      - SSH_ROOT_PASSWORD=password

이 예제에서 Dockerfile 은 SSH 서버가 구성된 컨테이너 이미지를 빌드하는 데 사용되고, ports 섹션은 컨테이너의 SSH 포트 (22) 를 호스트의 포트 22 로 매핑합니다. environment 섹션은 SSH 서버의 루트 비밀번호를 설정합니다.

이 방법을 사용하면 SSH 접근 권한이 활성화된 Docker 컨테이너를 쉽게 생성하여 Docker 기반 애플리케이션의 문제 해결 및 관리를 용이하게 할 수 있습니다.

요약

이 튜토리얼을 마치면 Docker 컨테이너에 SSH 를 구성하는 방법, "호스트 키를 로드할 수 없습니다" 오류를 진단하고 해결하는 방법, 그리고 Docker 기반 애플리케이션에 대한 안전한 SSH 연결을 유지하는 방법에 대한 확실한 이해를 얻게 될 것입니다. 이 지식은 Docker 개발 워크플로우를 간소화하고 컨테이너화된 환경의 전반적인 보안을 강화하는 데 도움이 될 것입니다.