공개키 암호화 방식
1. 개요
1. 개요
공개키 암호화 방식은 암호화와 복호화에 서로 다른 두 개의 키, 즉 공개키와 개인키를 사용하는 비대칭 암호화 체계이다. 공개키는 누구에게나 공개되어 메시지를 암호화하거나 서명을 검증하는 데 사용되며, 개인키는 소유자만이 비밀로 보관하여 암호화된 메시지를 복호화하거나 서명을 생성하는 데 사용된다. 이 방식은 대칭키 암호 방식의 키 배분 문제를 근본적으로 해결한 혁신적인 기술로 평가받는다.
SSH(Secure Shell) 프로토콜은 네트워크를 통한 안전한 원격 접속과 파일 전송을 제공하는 데, 공개키 암호화 방식을 핵심 요소로 활용한다. SSH는 초기 연결 수립 시 서버의 신원을 확인하는 호스트 키 인증과, 사용자가 서버에 로그인하는 공개키 인증 등 두 가지 주요 영역에서 이 방식을 적용한다. 이를 통해 중간자 공격을 방지하고 강력한 사용자 인증을 가능하게 한다.
SSH에서의 공개키 암호화는 일반적으로 세션 자체의 통신을 암호화하는 데 직접 사용되기보다는, 안전한 채널을 설정하는 과정을 보호하는 데 주로 쓰인다. 즉, 연결 초기에 공개키 방식을 이용해 서로를 인증하고, 이후 실제 데이터 암호화에 사용할 임시 대칭키를 안전하게 협상한다. 이 하이브리드 방식은 공개키 암호화의 보안성과 대칭키 암호화의 속도 효율성을 결합한 것이다.
2. SSH에서 공개키 암호화의 역할
2. SSH에서 공개키 암호화의 역할
SSH에서 공개키 암호화는 두 가지 핵심 기능, 즉 클라이언트 인증과 안전한 세션 키 교환을 담당한다. 이 방식은 기존의 비밀번호 인증보다 훨씬 강력한 보안을 제공하며, SSH 프로토콜의 근간을 이룬다.
인증 프로세스
클라이언트가 서버에 접속할 때, 서버는 클라이언트가 해당 공개키에 대응하는 개인키를 소유하고 있는지 확인하는 방식으로 인증을 수행한다. 구체적인 프로세스는 다음과 같다.
1. 클라이언트는 서버에 접속 요청을 보낸다.
2. 서버는 클라이언트에게 미리 등록된 공개키 목록(authorized_keys 파일)에서 일치하는 키를 찾아 '챌린지'를 생성하여 전송한다.
3. 클라이언트는 자신의 개인키로 이 챌린지를 서명하여 서버로 되돌려보낸다.
4. 서버는 등록된 공개키를 사용해 서명을 검증한다. 검증이 성공하면 클라이언트의 신원이 확인된 것으로 간주하고 접속을 허용한다. 이 과정에서 개인키 자체는 네트워크를 통해 전송되지 않으므로 도청 위험이 없다.
세션 키 교환
인증 이후 실제 데이터 통신을 암호화하는 데 사용되는 대칭 세션 키를 안전하게 협상하는 데에도 공개키 암호화가 활용된다. 초기 연결 수립 단계에서 클라이언트와 서버는 디피-헬먼 키 교환 또는 ECDH와 같은 키 교환 알고리즘을 사용하여 공유 비밀을 생성한다. 이 알고리즘들은 공개키 암호화의 원리를 기반으로 하여, 양측이 공개값을 교환만 함으로써 제3자가 알 수 없는 공유 비밀값을 각자 독립적으로 계산할 수 있게 한다. 이렇게 생성된 공유 비밀은 이후의 모든 통신을 암호화하는 대칭 세션 키를 유도하는 데 사용된다.
단계 | 주요 목적 | 사용되는 키 | 비고 |
|---|---|---|---|
키 교환 | 대칭 세션 키를 위한 공유 비밀 생성 | 임시로 생성된 키 쌍 | |
클라이언트 인증 | 서버에 대한 클라이언트 신원 확인 | 클라이언트의 고정 키 쌍 |
|
데이터 암호화 | 실시간 통신 채널 보호 | 협상된 대칭 세션 키 |
따라서 SSH는 공개키 암호화를 이중으로 활용하여, 강력한 인증과 함께 완전한 기밀성과 전방향 안전성을 갖춘 통신 채널을 수립한다.
2.1. 인증 프로세스
2.1. 인증 프로세스
SSH에서 공개키 암호화를 이용한 인증 프로세스는 클라이언트가 서버에 자신의 신원을 증명하는 방법이다. 이 과정은 비밀번호를 입력하지 않고도 안전한 접속을 가능하게 한다. 핵심은 클라이언트가 개인키를 소유하고 있다는 사실을 암호학적으로 증명하는 데 있다.
인증 프로세스는 다음과 같은 단계로 진행된다. 먼저, 클라이언트는 연결을 시도할 때 서버에 자신의 공개키를 전송한다. 서버는 이 공개키가 미리 등록된 사용자의 ~/.ssh/authorized_keys 파일에 존재하는지 확인한다. 공개키가 등록되어 있으면, 서버는 클라이언트에게 임의의 메시지(챌린지)를 생성하여 전송한다. 이 메시지는 클라이언트의 개인키로만 서명할 수 있다.
클라이언트는 수신한 챌린지 메시지를 자신이 보관하고 있는 개인키로 서명한다. 이렇게 생성된 디지털 서명을 서버로 되돌려 보낸다. 서버는 처음에 받은 공개키를 이용해 이 서명을 검증한다. 공개키로 서명 검증에 성공하면, 클라이언트가 해당 개인키의 소유자임이 증명되고 인증이 완료된다. 개인키는 절대 네트워크를 통해 전송되지 않는다.
이 프로세스의 보안성은 개인키의 비밀 유지에 달려 있다. 서버는 공개키만을 저장하며, 이는 외부에 공개되어도 안전하다. 인증 성공 후, 양측은 보통 대칭키 암호를 사용한 보안 채널을 수립하여 이후의 모든 통신을 암호화한다.
2.2. 세션 키 교환
2.2. 세션 키 교환
SSH 연결에서 대칭키 암호를 사용한 실제 데이터 통신을 시작하기 전, 클라이언트와 서버는 안전하게 세션 키를 협상해야 합니다. 이 과정을 키 교환 또는 키 교환 알고리즘이라고 합니다. 공개키 암호화 방식은 이 세션 키 교환을 안전하게 수행하는 데 핵심적인 역할을 합니다.
주로 사용되는 키 교환 알고리즘은 디피-헬만 키 교환과 그 변종들(예: ECDH)입니다. 이 프로토콜은 두 당사자가 공개 채널을 통해 정보를 교환하여 공통의 비밀값을 도출할 수 있게 합니다. 구체적인 과정은 다음과 같습니다.
1. 연결 초기화 시, 클라이언트와 서버는 지원하는 키 교환 알고리즘 목록을 교환하고 공통으로 지원하는 하나를 선택합니다.
2. 서버는 자신의 공개키를 포함한 서버 공개키 호스트 키를 클라이언트에 보냅니다. 클라이언트는 이 키를 통해 서버의 신원을 확인합니다[1].
3. 선택된 키 교환 알고리즘에 따라, 클라이언트와 서버는 각각 임시 키 쌍을 생성하고 공개키 부분만 상대방에게 전송합니다.
4. 각자는 자신의 개인키와 상대방의 공개키를 사용하여 동일한 공유 비밀을 독립적으로 계산합니다. 이 계산된 값은 제3자가 도청하더라도 알 수 없습니다.
5. 이 공유 비밀을 기반으로, 양측은 이후 통신에 사용할 실제 대칭키 암호의 세션 키를 생성합니다.
이렇게 생성된 세션 키는 연결 기간 동안 데이터의 기밀성과 무결성을 보호하는 데 사용됩니다. 이 교환 방식의 주요 이점은 사전에 비밀키를 공유할 필요 없이 안전한 채널을 수립할 수 있다는 점입니다. 또한, 각 SSH 세션마다 고유한 세션 키가 생성되므로, 하나의 세션 키가 유출되더라도 다른 세션은 안전하게 보호됩니다.
3. 키 쌍 생성 및 관리
3. 키 쌍 생성 및 관리
SSH에서 사용되는 키 쌍은 공개키 암호화의 핵심 요소로, 하나의 개인키와 하나의 공개키로 구성된다. 개인키는 절대 외부에 유출되어서는 안 되는 비밀 정보이며, 공개키는 접속을 허용할 서버에 등록하는 공개 정보이다. 이 두 키는 수학적으로 연결되어 있지만, 공개키로부터 개인키를 추론하는 것은 현실적으로 불가능하다[2].
키 생성은 주로 ssh-keygen 명령어를 통해 이루어진다. 사용자는 이 도구를 이용해 원하는 암호화 알고리즘과 키 길이를 지정할 수 있다. 일반적인 알고리즘과 특징은 다음과 같다.
알고리즘 | 주요 특징 | 일반적인 키 길이/곡선 |
|---|---|---|
역사가 길고 호환성이 매우 뛰어나다. | 2048비트, 3072비트, 4096비트 | |
타원곡선 암호 기반으로, 동일한 보안 수준에서 키가 짧고 속도가 빠르다. | 곡선 | |
타원곡선 암호 기반의 다른 알고리즘이다. |
|
생성된 공개키(.pub 확장자 파일)는 접속 대상 서버의 ~/.ssh/authorized_keys 파일에 등록된다. 이 파일에 한 줄씩 공개키를 기록함으로써, 해당 키 쌍을 소유한 클라이언트의 접속을 허용한다. 반면 개인키는 클라이언트 컴퓨터에 안전하게 보관해야 한다. 개인키 파일의 권한은 소유자만 읽고 쓸 수 있도록 제한하는 것이 기본 보안 관행이다(예: chmod 600 ~/.ssh/id_algorithm). 또한, 개인키를 암호화하기 위해 패스프레이즈를 설정하는 것이 강력히 권장된다. 패스프레이즈는 개인키 파일을 사용할 때마다 입력해야 하는 암호문구로, 키 파일이 유출되더라도 추가적인 보안 계층을 제공한다.
3.1. 키 생성 알고리즘 (RSA, Ed25519 등)
3.1. 키 생성 알고리즘 (RSA, Ed25519 등)
SSH 키 쌍을 생성할 때는 다양한 암호화 알고리즘 중 하나를 선택할 수 있다. 각 알고리즘은 키 길이, 성능, 보안 강도 측면에서 차이를 보인다. 역사적으로 RSA 알고리즘이 가장 널리 사용되었지만, 최근에는 Ed25519와 같은 더 현대적인 타원곡선 암호 기반 알고리즘의 채용이 권장된다.
주요 알고리즘과 그 특징은 다음과 같다.
알고리즘 | 키 유형 | 일반적인 키 길이 (비트) | 보안 및 성능 특징 |
|---|---|---|---|
공개키 | 2048, 3072, 4096 | 오랜 기간 검증됨. 호환성이 가장 뛰어나다. 키 길이가 길수록 생성 및 사용 시 계산 부하가 증가한다. | |
타원곡선 | 256, 384, 521 | 동일한 보안 수준에서 RSA보다 키 길이가 짧고 효율적이다. NIST 표준 곡선을 사용한다. | |
타원곡선 (EdDSA) | 256 | 높은 성능과 강력한 보안으로 간주된다. 부채널 공격에 대한 저항성이 있다. 키 길이가 짧고 서명 속도가 빠르다. |
RSA 키는 ssh-keygen -t rsa -b 4096 명령으로 생성할 수 있으며, 2048비트는 현재 최소한의 길이로 간주된다. Ed25519 키는 ssh-keygen -t ed25519 명령으로 생성한다. ECDSA의 경우 ssh-keygen -t ecdsa -b 256과 같이 생성하며, 키 길이는 256, 384, 521비트 중 선택할 수 있다.
알고리즘 선택은 보안 요구사항과 호환성에 따라 결정된다. 새로운 시스템에서는 Ed25519를 우선적으로 고려하는 것이 좋다. 이는 동일한 보안 수준에서 더 나은 성능을 제공하며, 키 크기도 작기 때문이다. 그러나 오래된 클라이언트나 서버 소프트웨어는 Ed25519를 지원하지 않을 수 있어, 이 경우 RSA 3072비트 이상을 사용하는 것이 대안이 될 수 있다.
3.2. 공개키 배포 (authorized_keys)
3.2. 공개키 배포 (authorized_keys)
SSH 서버에 사용자를 인증하기 위해서는 클라이언트의 공개키를 서버에 등록해야 한다. 이 과정을 '공개키 배포'라고 하며, 등록된 키는 일반적으로 서버의 사용자 홈 디렉터리 내 .ssh/authorized_keys 파일에 저장된다. 이 파일은 해당 사용자 계정으로의 공개키 인증을 허용할 공개키들의 목록을 담고 있다.
authorized_keys 파일의 각 줄은 하나의 공개키를 나타낸다. 한 줄은 키 유형, 공개키 자체, 그리고 선택적으로 주석으로 구성된다. 서버는 클라이언트가 연결을 시도할 때, 클라이언트가 제시하는 공개키가 이 파일의 어느 한 줄과 정확히 일치하는지 확인한다. 일치하는 키가 있으면, 해당 클라이언트는 서버에 제시한 개인키를 소유하고 있다는 것을 암호학적으로 증명해야 하는 다음 단계로 진행한다.
공개키를 배포하는 일반적인 방법은 ssh-copy-id 명령어를 사용하는 것이다. 이 명령어는 로컬에 있는 공개키 파일(예: ~/.ssh/id_rsa.pub)을 지정된 서버와 사용자 계정의 authorized_keys 파일 끝에 자동으로 추가한다. 명령어 형식은 ssh-copy-id user@hostname이다. 수동으로 배포하려면 클라이언트의 공개키 내용을 복사하여 서버의 ~/.ssh/authorized_keys 파일 끝에 붙여넣으면 된다.
authorized_keys 파일과 상위 .ssh 디렉터리의 권한 설정은 보안상 매우 중요하다. 서버는 과도하게 개방된 권한을 가진 이 파일을 신뢰하지 않는다. 일반적으로 다음과 같은 권한이 요구된다.
파일/디렉터리 | 권한 (8진수) | 권한 (문자) |
|---|---|---|
사용자 홈 디렉터리 | 755 이하 | drwxr-xr-x 이하 |
| 700 | drwx------ |
| 600 | -rw------- |
권한이 올바르게 설정되지 않으면 서버가 공개키 인증을 거부하고 대신 비밀번호 인증을 요구할 수 있다. 또한, 이 파일을 관리함으로써 서버 관리자는 특정 키에 대해 원격 명령 제한이나 에이전트 포워딩 제한과 같은 고급 옵션을 설정할 수 있다[3].
3.3. 개인키 보안 관행
3.3. 개인키 보안 관행
SSH 개인키는 접속하려는 시스템에 대한 모든 권한을 부여하는 매우 민감한 정보이다. 따라서 이를 안전하게 보관하고 관리하는 관행은 시스템 보안의 핵심이다.
가장 기본적인 원칙은 개인키를 절대 타인과 공유하거나 네트워크를 통해 전송하지 않는 것이다. 개인키는 생성된 클라이언트 시스템에만 보관해야 한다. 키 파일의 파일 시스템 권한은 반드시 제한적으로 설정되어야 한다. 일반적으로, 사용자 본인만 읽을 수 있도록 600 (소유자 읽기/쓰기) 권한으로 설정하는 것이 표준 관행이다. 권한이 너무 개방적이면(예: 644), SSH 클라이언트가 보안 위험을 이유로 키 사용을 거부할 수 있다[4].
개인키의 보안성을 추가로 강화하기 위해 패스프레이즈를 사용하는 것이 강력히 권장된다. 패스프레이즈는 개인키 파일 자체를 대칭키 암호로 암호화하여, 키를 사용할 때마다 올바른 구문을 입력해야만 복호화하도록 한다. 이는 개인키 파일이 유출되더라도 패스프레이즈를 모르면 키를 사용할 수 없게 하는 중요한 보안 계층을 추가한다. 패스프레이즈 관리는 SSH 에이전트를 활용하여 편의성을 높일 수 있다. 에이전트는 메모리에 복호화된 키를 일시적으로 보관하여 세션 동안 반복적인 패스프레이즈 입력을 줄여준다.
관행 | 설명 | 주의사항 |
|---|---|---|
엄격한 파일 권한 | 개인키 파일 권한을 | 부적절한 권한은 연결 실패를 유발 |
패스프레이즈 사용 | 개인키를 암호화하여 무단 사용 방지 | 강력하고 독특한 구문을 사용해야 함 |
SSH 에이전트 활용 | 복호화된 키를 안전한 메모리에 캐싱하여 사용 편의성 증대 | 에이전트가 실행 중인 터미널 세션을 로그아웃할 때 종료 확인 |
안전한 백업 | 개인키를 암호화된 볼트나 오프라인 매체에 백업 | 백업 매체의 물리적 보안도 중요 |
주기적인 키 교체 | 정기적으로 새로운 키 쌍을 생성하고 이전 키를 폐기 |
|
또한, 개인키의 백업은 신중하게 수행해야 한다. 백업이 필요하다면, 암호화된 저장 매체나 완전히 오프라인인 안전한 장소에 보관한다. 마지막으로, 정기적인 키 교체 정책을 수립하는 것이 좋다. 장기간 동일한 키를 사용하면 노출 위험이 누적될 수 있으므로, 일정 기간이 지나면 새로운 키 쌍을 생성하고 서버의 authorized_keys 파일에서 이전 공개키를 제거해야 한다.
4. 공개키 인증 설정 방법
4. 공개키 인증 설정 방법
공개키 인증을 설정하려면 클라이언트 측에서 키 쌍을 생성한 후, 서버 측에 공개키를 등록해야 한다. 클라이언트 측에서는 ssh-keygen 명령어를 사용하여 키를 생성한다. 이 명령을 실행하면 키 유형(예: RSA, Ed25519)과 키 길이, 저장 경로, 패스프레이즈를 설정할 수 있다. 생성된 키 쌍 중 공개키(.pub 확장자 파일)는 서버로 전송되어야 하며, 개인키는 클라이언트에 안전하게 보관된다.
서버 측 설정은 클라이언트의 공개키를 특정 사용자의 ~/.ssh/authorized_keys 파일에 추가하는 것으로 이루어진다. 이 파일은 SSH 서버(sshd)가 신뢰할 수 있는 공개키 목록을 참조하는 데 사용된다. 공개키를 추가하는 일반적인 방법은 ssh-copy-id 유틸리티를 사용하는 것이며, 이는 올바른 권한으로 파일을 생성하고 내용을 추가한다. 수동으로 수행할 경우, 공개키 파일의 내용을 authorized_keys 파일 끝에 복사하여 붙여넣으면 된다.
authorized_keys 파일과 상위 .ssh 디렉토리의 권한 설정은 보안상 매우 중요하다. 서버는 과도하게 개방된 권한을 가진 파일을 신뢰하지 않는다. 일반적으로 다음과 같은 권한이 요구된다.
파일/디렉토리 | 권한 (8진수) | 권한 설명 |
|---|---|---|
사용자 홈 디렉토리 ( | 755 ( | 그룹 및 다른 사용자 쓰기 권한 없음 |
| 700 ( | 소유자만 읽기/쓰기/실행 가능 |
| 600 ( | 소유자만 읽기/쓰기 가능 |
설정이 완료되면, 클라이언트는 SSH 연결 시도 시 자동으로 해당 개인키를 사용하여 인증을 시도한다. 개인키에 패스프레이즈가 설정된 경우, 사용자에게 이를 입력하라는 프롬프트가 표시된다. 성공적으로 설정되었다면, 서버는 비밀번호 없이 공개키 기반으로 클라이언트를 인증하게 된다.
4.1. 클라이언트 측 설정
4.1. 클라이언트 측 설정
클라이언트 측에서 공개키 암호화 방식을 이용한 SSH 인증을 설정하려면, 먼저 키 쌍을 생성하고 생성된 공개키를 원격 서버에 등록해야 한다. 주요 단계는 다음과 같다.
첫 번째 단계는 ssh-keygen 명령어를 사용하여 키 쌍을 생성하는 것이다. 이 명령을 실행하면 키 유형(예: RSA, Ed25519)과 키 길이, 저장 경로, 그리고 선택적으로 패스프레이즈를 설정할 수 있다. 일반적인 Ed25519 키 생성 명령은 ssh-keygen -t ed25519이다. 명령을 실행하면 기본적으로 사용자의 ~/.ssh/ 디렉토리에 id_ed25519(개인키)와 id_ed25519.pub(공개키) 파일이 생성된다.
단계 | 명령어 예시 | 설명 |
|---|---|---|
키 생성 |
| Ed25519 알고리즘으로 키 쌍을 생성하고 주석을 추가한다. |
키 확인 |
| 생성된 |
공개키 내용 확인 |
| 서버에 등록할 공개키 문자열을 출력하여 확인한다. |
생성된 공개키를 원격 서버에 등록하는 방법은 주로 ssh-copy-id 명령어를 사용한다. 이 명령은 공개키를 지정된 서버의 ~/.ssh/authorized_keys 파일에 자동으로 추가한다. 예를 들어, ssh-copy-id user@remote_server 명령을 실행하면, 해당 서버의 사용자 계정 authorized_keys 파일에 클라이언트의 공개키가 추가된다. ssh-copy-id 도구를 사용할 수 없는 환경에서는, 공개키 내용을 수동으로 복사하여 서버 측에서 동일한 파일에 붙여넣는 방식으로 등록할 수 있다. 설정이 완료되면, 이후 접속 시 비밀번호 대신 개인키(및 설정한 패스프레이즈)를 사용하여 인증하게 된다.
4.2. 서버 측 설정
4.2. 서버 측 설정
서버 측에서 공개키 인증을 활성화하려면, 클라이언트의 공개키를 신뢰할 수 있는 키 목록에 등록해야 한다. 이 작업은 일반적으로 대상 사용자의 홈 디렉토리 내 ~/.ssh/authorized_keys 파일을 수정하여 수행한다. 시스템 관리자는 /etc/ssh/sshd_config 구성 파일을 편집하여 비밀번호 인증을 비활성화하고 공개키 인증만 허용하도록 강제할 수 있다.
authorized_keys 파일에 공개키를 등록하는 기본 절차는 다음과 같다.
1. 클라이언트에서 생성된 공개키(예: id_ed25519.pub 파일의 내용)를 복사한다.
2. 서버의 대상 사용자 계정으로 로그인한다.
3. ~/.ssh 디렉토리가 존재하는지 확인하고, 없다면 적절한 권한(700)으로 생성한다.
4. ~/.ssh/authorized_keys 파일을 열어 복사한 공개키 내용을 새로운 줄에 붙여넣고 저장한다. 이 파일의 권한은 반드시 600으로 설정해야 한다[5].
주요 sshd_config 설정 옵션은 아래와 같다.
설정 지시어 | 기본값 | 설명 및 권장값 |
|---|---|---|
| yes | 공개키 인증 사용 여부. |
| yes | 비밀번호 인증 사용 여부. 보안 강화를 위해 |
| .ssh/authorized_keys | 공개키 파일의 경로. 기본값을 일반적으로 사용한다. |
| prohibit-password | root 로그인 정책. |
설정 변경 후에는 SSH 데몬을 재시작하여 변경사항을 적용해야 한다(예: systemctl restart sshd). 새로운 공개키 인증 방식으로 연결을 시도하기 전에, 기존의 연결 세션을 종료하지 않고 다른 터미널 창을 열어 서버에 접속된 상태를 유지하는 것이 좋다. 이는 설정 오류로 인한 접속 차단 시 문제를 해결할 수 있는 백도어 역할을 한다.
5. 비밀번호 인증 대비 장단점
5. 비밀번호 인증 대비 장단점
공개키 인증은 비밀번호 인증에 비해 몇 가지 뚜렷한 장점을 가진다. 가장 큰 장점은 네트워크를 통해 비밀번호가 전송되지 않는다는 점이다. 이는 스니핑 공격으로부터 본질적으로 안전함을 의미한다. 또한, 무차별 대입 공격이나 사전 공격에 취약하지 않다. 공격자가 서버에 직접 접근하지 않는 한, 유효한 개인키를 추측하는 것은 현실적으로 불가능하다. 관리 측면에서는 사용자마다 고유한 키 쌍을 사용할 수 있어, 계정 공유 없이 접근 권한을 부여하고 철회하는 것이 용이하다. 또한, 패스프레이즈를 사용하여 개인키 파일 자체를 암호화하면, 키 파일이 유출되더라도 추가적인 보안 계층을 제공할 수 있다.
반면, 공개키 인증은 초기 설정과 관리가 더 복잡하다는 단점이 있다. 사용자는 키 쌍을 생성하고, 공개키를 서버에 배포해야 한다. 개인키의 관리 책임이 완전히 사용자에게 있으며, 키 파일을 분실하거나 손상시키면 접근이 불가능해진다. 또한, 중앙 집중식 인증 서버(LDAP, Active Directory 등)와의 통합이 비밀번호 방식보다 덜 직관적일 수 있다. 비밀번호는 사용자가 기억하는 지식 기반 인증인 반면, 공개키 인증은 사용자가 소유한 파일(개인키)에 의존하기 때문에, 사용자 교육과 키 관리 정책이 중요해진다.
다음 표는 두 방식을 주요 항목별로 비교한 것이다.
비교 항목 | 공개키 인증 | 비밀번호 인증 |
|---|---|---|
인증 요소 | 사용자가 소유한 개인키 파일 | 사용자가 아는 비밀번호 |
네트워크 전송 | 개인키는 절대 전송되지 않음 | 비밀번호가 암호화된 채널을 통해 전송됨 |
무차별 대입 공격 저항성 | 매우 높음 (개인키 추측 불가) | 낮음 (짧거나 일반적인 비밀번호는 취약) |
초기 설정 및 관리 | 상대적으로 복잡 (키 생성, 배포 필요) | 간단 (사용자 계정 생성 시 설정) |
사용자 편의성 | 한 번 설정하면 로그인 시 패스프레이즈만 입력(선택사항) | 매번 비밀번호 입력 필요 |
키/비밀번호 분실 시 | 접근 불가. 새 키 쌍 생성 및 배포 필요 | 관리자를 통한 재설정 가능 |
중앙 집중식 인증 통합 | 가능하지만 설정이 복잡할 수 있음 | 일반적으로 잘 지원됨 |
종합하면, 보안성이 가장 중요한 서버 환경에서는 공개키 인증이 강력히 권장된다. 반면, 사용자 편의성과 간편한 관리, 또는 일회성 접근이 필요한 경우에는 비밀번호 인증이 여전히 유효한 선택지가 될 수 있다. 많은 프로덕션 환경에서는 보안 강화를 위해 비밀번호 인증을 완전히 비활성화하고 공개키 인증만 사용하기도 한다.
6. 보안 고려사항 및 모범 사례
6. 보안 고려사항 및 모범 사례
SSH에서 공개키 암호화 방식을 안전하게 사용하기 위해서는 키의 강도, 알고리즘 선택, 그리고 개인키 관리에 대한 명확한 모범 사례를 따르는 것이 중요하다. 핵심은 개인키의 비밀성을 유지하는 것이며, 이는 전체 보안 체계의 기반이 된다.
키의 강도는 사용하는 암호화 알고리즘과 키 길이에 의해 결정된다. 역사적으로 널리 사용된 RSA 알고리즘의 경우, 최소 2048비트, 바람직하게는 4096비트의 키 길이가 권장된다[6]. 더 현대적이고 효율적인 타원곡선 암호 기반 알고리즘인 Ed25519는 256비트 키를 사용하며 동등한 보안 수준을 제공하면서도 성능이 더 우수하다. 현재는 보안상의 이유로 DSA나 1024비트 RSA와 같은 오래되고 약한 알고리즘의 사용을 피해야 한다. 알고리즘 선택은 클라이언트와 서버 양측의 지원 여부를 확인해야 한다.
개인키를 보호하는 가장 효과적인 방법 중 하나는 패스프레이즈를 사용하는 것이다. 패스프레이즈는 개인키 파일 자체를 암호화하여, 키 파일이 유출되더라도 추가적인 비밀번호 없이는 사용할 수 없게 만든다. 그러나 편의성을 위해 패스프레이즈를 생략하는 경우가 많으며, 이 경우 개인키 파일의 파일 시스템 권한을 반드시 제한적으로 설정(예: 사용자 읽기 전용)하고 안전한 저장 매체에 보관해야 한다. 또한, 다음과 같은 관리 관행을 준수하는 것이 좋다.
모범 사례 | 설명 |
|---|---|
키 회전 | 정기적으로 새로운 키 쌍을 생성하여 오래된 키를 교체한다. |
제한된 사용 | 서버별로 다른 키 쌍을 사용하여 한 키가 유출되도 피해를 최소화한다. |
authorized_keys 제어 | 서버의 |
에이전트 활용 | SSH 에이전트를 사용하면 패스프레이즈를 한 번만 입력하고 세션 동안 키를 메모리에 안전하게 캐싱할 수 있다. |
마지막으로, 서버 측에서는 공개키 인증만을 허용하고 비밀번호 인증을 완전히 비활성화하는 것이 공격 표면을 크게 줄이는 방법이다. 또한, fail2ban 같은 침입 탐지 시스템을 함께 사용하면 무작위 공격 시도로부터 추가적인 보호 계층을 제공할 수 있다.
6.1. 키 강도 및 알고리즘 선택
6.1. 키 강도 및 알고리즘 선택
SSH 연결의 장기적 보안은 사용하는 암호화 키의 강도와 암호 알고리즘의 선택에 직접적으로 의존한다. 키 강도는 일반적으로 키의 길이(비트 수)로 표현되며, 이는 무차별 대입 공격에 대한 저항력을 결정한다. 역사적으로 RSA 알고리즘이 가장 널리 사용되었으나, 최신 시스템에서는 타원곡선 암호 기반 알고리즘인 ECDSA나 Ed25519가 더 효율적이고 강력한 옵션으로 권장된다. 알고리즘 선택은 호환성과 보안 수준 사이의 균형을 고려해야 한다.
다음 표는 일반적인 SSH 키 알고리즘을 비교한 것이다.
알고리즘 | 권장 최소 키 길이/곡선 | 보안 강점 | 참고 사항 |
|---|---|---|---|
3072비트 이상 | 오랜 기간 검증됨, 호환성 최고 | 2048비트 키는 현재까지 안전하지만, 미래를 위해 3072비트 이상을 권장한다. | |
NIST P-256 곡선 이상 | 동일한 보안 수준에서 RSA보다 키 길이가 짧다. | 올바른 난수 생성기에 의존한다. 널리 지원된다. | |
256비트 (고정) | 높은 성능, 부채널 공격 저항성, 결정론적 키 생성 | 최신 프로토콜에서 선호되며, 점차 지원 범위가 확대되고 있다. |
키 강도를 선택할 때는 보호하려는 데이터의 가치와 예상되는 위협 수준을 고려해야 한다. 현재 기준으로 2048비트 RSA 키는 단기적으로는 안전할 수 있으나, 장기적인 보안을 위해서는 3072비트 또는 4096비트를 사용하는 것이 좋다. Ed25519는 256비트 키로도 매우 높은 보안 수준을 제공하며, 성능 면에서도 우수하다. 중요한 것은 오래되고 취약한 것으로 알려진 알고리즘(예: 1024비트 RSA 또는 DSA)을 사용하지 않는 것이다.
서버 측에서는 sshd_config 파일을 통해 허용할 공개키 인증 알고리즘을 제한할 수 있다. PubkeyAcceptedKeyTypes 지시어를 사용하여 강력한 알고리즘(예: ssh-ed25519,ecdsa-sha2-nistp256,rsa-sha2-512)만 허용하고, 오래된 알고리즘은 명시적으로 제외하는 것이 모범 사례이다. 이렇게 하면 클라이언트가 약한 키를 사용하여 연결하는 것을 방지할 수 있다. 알고리즘 지원 현황은 SSH 클라이언트와 서버의 버전에 따라 달라질 수 있으므로, 호환성을 테스트하는 것이 필요하다.
6.2. 패스프레이즈 사용
6.2. 패스프레이즈 사용
패스프레이즈는 개인키 파일을 암호화하는 데 사용되는 추가적인 암호 구문이다. 이는 개인키 파일이 유출되더라도 패스프레이즈를 모르면 키를 사용할 수 없게 함으로써 보안을 강화하는 역할을 한다. 키 생성 시 ssh-keygen 명령어를 실행하면 패스프레이즈를 설정할 수 있으며, 이후 해당 키를 사용해 연결할 때마다 패스프레이즈를 입력해야 한다.
패스프레이즈 사용의 주요 장점은 방어 심층화를 제공한다는 점이다. 예를 들어, 개인키가 저장된 노트북을 분실하거나 백업 미디어가 도난당한 경우, 공격자는 암호화된 개인키 파일을 획득하더라도 실제로 사용할 수 없다. 또한, 시스템 메모리에 상주하는 SSH 에이전트 같은 도구를 사용하면 연결 세션 동안 패스프레이즈를 한 번만 입력하면 되므로 사용 편의성과 보안을 동시에 확보할 수 있다.
그러나 패스프레이즈 사용은 자동화 스크립트나 무인 배포 프로세스에서는 문제가 될 수 있다. 이러한 경우에는 패스프레이즈 없이 키를 생성하거나, SSH 에이전트를 통해 미리 키를 로드해 두는 방법을 고려해야 한다. 패스프레이즈는 충분히 길고 복잡해야 하며, 다른 서비스의 암호와 동일하게 재사용해서는 안 된다. 키의 보안 수준은 결국 가장 약한 요소에 의해 결정되므로, 강력한 암호화 알고리즘으로 생성된 키라도 약한 패스프레이즈로 인해 전체 보안이 무너질 수 있다.
7. 문제 해결
7. 문제 해결
SSH 공개키 인증 사용 시 발생할 수 있는 일반적인 문제는 주로 파일 권한 설정 오류, 키 쌍 불일치, 네트워크 또는 서비스 구성 문제로 인해 발생합니다.
가장 흔한 연결 오류 중 하나는 서버가 클라이언트의 공개키를 거부하는 경우입니다. 이는 주로 서버의 ~/.ssh/authorized_keys 파일에 해당 공개키가 정확히 등록되지 않았거나, 파일이나 상위 디렉터리의 권한이 너무 개방적일 때 발생합니다. 서버 측에서 ~/.ssh 디렉터리의 권한은 700(drwx------), authorized_keys 파일의 권한은 600(-rw-------)으로 설정되어야 합니다. 권한이 올바르지 않으면 SSH 데몬이 보안상 이유로 키 파일을 읽지 않습니다. 클라이언트 측 개인키 파일(id_rsa, id_ed25519 등)의 권한도 600으로 제한되어야 합니다. ssh 명령어에 -v(verbose) 옵션을 추가하면 연결 과정의 상세 로그를 확인하여 오류 원인을 파악하는 데 도움이 됩니다.
일반적인 오류 메시지 | 가능한 원인 | 해결 방안 |
|---|---|---|
| 1. 공개키가 2. 파일 권한이 틀림. 3. 서버에서 공개키 인증이 비활성화됨. | 1. 공개키를 정확히 복사했는지 확인. 2. 3. 서버의 |
| SSH 에이전트에 개인키가 로드되지 않음. |
|
| 개인키 파일의 권한이 너무 개방적(예: 644). | 개인키 파일 권한을 600으로 변경 ( |
키 쌍 불일치 문제는 클라이언트가 서버에 등록된 것과 다른 개인키를 사용하려 할 때 발생합니다. 클라이언트는 -i 옵션으로 특정 개인키 파일을 명시적으로 지정할 수 있습니다. 또한, 개인키에 패스프레이즈를 설정한 경우, SSH 에이전트가 실행 중이지 않으면 매번 암호를 입력해야 합니다. 에이전트를 사용하면 세션 동안 한 번만 패스프레이즈를 입력하면 됩니다. 서버 측 SSH 데몬 설정 문제도 원인이 될 수 있습니다. /etc/ssh/sshd_config 파일에서 PubkeyAuthentication 지시어가 yes로 설정되어 있는지, AuthorizedKeysFile 경로가 기본값(.ssh/authorized_keys)에서 변경되지 않았는지 확인해야 합니다. 변경 사항을 적용하려면 서버에서 SSH 서비스를 재시작해야 합니다.
7.1. 일반적인 연결 오류
7.1. 일반적인 연결 오류
SSH 클라이언트가 공개키 인증을 사용하여 서버에 연결할 때 발생하는 일반적인 오류와 그 해결 방법은 다음과 같다.
가장 흔한 오류는 "Permission denied (publickey)"이다. 이는 서버가 제시된 공개키를 인증에 사용할 수 없음을 의미한다. 주요 원인과 해결책은 다음과 같다.
* 잘못된 공개키 등록: 클라이언트의 공개키가 서버의 ~/.ssh/authorized_keys 파일에 정확히 등록되지 않았다. 공개키를 다시 복사하거나 ssh-copy-id 명령어를 사용하여 등록을 확인한다.
* 파일 권한 문제: 서버 측의 ~/.ssh 디렉터리나 authorized_keys 파일의 권한이 너무 개방적이다. 일반적으로 ~/.ssh 디렉터리는 700 (drwx------), authorized_keys 파일은 600 (-rw-------) 권한이어야 한다. chmod 명령으로 수정한다.
* 잘못된 개인키 지정: 클라이언트가 기본 경로(~/.ssh/id_rsa, ~/.ssh/id_ed25519 등)가 아닌 다른 키를 사용할 때, -i 옵션으로 올바른 개인키 파일 경로를 명시적으로 지정하지 않았다. ssh -i /경로/개인키 사용자@호스트 형식으로 연결을 시도한다.
"Agent admitted failure to sign using the key" 오류는 SSH 에이전트가 개인키에 대한 접근이나 사용에 실패했을 때 발생한다. ssh-add 명령을 실행하여 키를 에이전트에 명시적으로 추가하면 해결될 수 있다. 또한 "Too many authentication failures" 오류는 클라이언트가 제한 횟수 내에 올바른 키를 제시하지 못했을 때 발생한다. 이 경우 -o PubkeyAuthentication=no 옵션을 일시적으로 사용하여 공개키 인증 시도를 비활성화하거나, ssh -i 옵션으로 정확한 키 하나만 지정하여 연결을 시도할 수 있다.
연결 문제의 근본 원인을 파악하려면 클라이언트와 서버 양쪽의 로그를 확인하는 것이 유용하다. 클라이언트는 -v (verbose) 옵션을 추가하여 디버그 메시지를 출력하게 할 수 있다(예: ssh -v 사용자@호스트). 서버 측 로그(일반적으로 /var/log/auth.log 또는 /var/log/secure)를 검토하면 인증 실패에 대한 상세한 시스템 기록을 확인할 수 있다.
7.2. 권한 문제
7.2. 권한 문제
SSH 공개키 암호화 방식을 사용할 때 발생하는 권한 문제는 주로 파일 및 디렉터리의 소유권과 접근 권한 설정이 부적절하여 발생합니다. 대부분의 SSH 서버, 특히 OpenSSH는 보안상의 이유로 과도하게 개방된 권한을 가진 파일을 신뢰하지 않습니다.
가장 흔한 문제는 사용자의 홈 디렉터리(~), .ssh 디렉터리, 그리고 그 내부의 authorized_keys 파일에 대한 권한 설정입니다. 서버는 일반적으로 다음의 엄격한 권한을 요구합니다.
파일/디렉터리 | 권한 (8진법) | 권한 설명 |
|---|---|---|
사용자 홈 디렉터리 ( | 755 (drwxr-xr-x) | 소유자는 읽기/쓰기/실행, 그룹 및 기타 사용자는 읽기/실행만 가능합니다. |
| 700 (drwx------) | 소유자만 읽기/쓰기/실행이 가능합니다. |
| 600 (-rw-------) | 소유자만 읽기와 쓰기가 가능합니다. |
권한 문제가 발생하면 서버는 보안 로그(예: /var/log/auth.log 또는 /var/log/secure)에 "Authentication refused: bad ownership or modes"와 같은 메시지를 기록합니다. 이 문제를 해결하기 위해선 chmod와 chown 명령어를 사용하여 올바른 소유권과 권한을 재설정해야 합니다. 예를 들어, authorized_keys 파일의 권한을 수정하려면 chmod 600 ~/.ssh/authorized_keys 명령을 실행합니다.
또 다른 권한 문제는 셸이 로그인 시 사용자의 .ssh 디렉터리나 관련 파일을 읽을 수 없는 경우 발생할 수 있습니다. 이는 디렉터리 경로 상의 모든 상위 디렉터리에 대해 다른 사용자(others)에게 실행(x) 권한이 있어야 하기 때문입니다. 예를 들어, 홈 디렉터리의 권한이 750이라면, 해당 사용자로의 SSH 접근은 정상 작동하지만, 권한이 770으로 설정되어 다른 사용자에게 쓰기 권한이 주어지면 보안 검사에 실패할 수 있습니다.
