SSH 키 개요
SSH 키는 클라이언트가 서버에 인증할 때 사용되는 주요 메커니즘 중 하나이다. 이 과정은 암호 기반 인증과는 달리, 공개키 암호화를 사용하여 보안을 강화할 수 있다. 이 섹션에서는 SSH 키를 관리하고 배포하는 방법에 대해 다룬다.
authorized_keys 파일의 역할
authorized_keys
파일은 서버에서 클라이언트가 인증을 시도할 때 사용할 수 있는 공개키 목록을 포함하고 있는 파일이다. 이 파일에 저장된 공개키는 서버가 해당 키를 통해 클라이언트의 인증 요청을 신뢰할 수 있음을 나타낸다.
서버는 ~/.ssh/authorized_keys
파일에서 공개키를 찾아보고, 클라이언트가 제공한 비밀키로 해당 공개키에 맞는 암호화된 메시지를 복호화할 수 있는지 확인한다. 이를 통해 비밀번호 없이도 클라이언트는 서버에 안전하게 접근할 수 있다.
authorized_keys 파일 설정
authorized_keys
파일은 서버에서 클라이언트가 접근할 수 있도록 하는 공개키를 관리하는데 중요한 역할을 한다. 이 파일은 홈 디렉토리 아래 ~/.ssh/authorized_keys
경로에 위치하며, 각 공개키는 별도의 줄에 작성된다. 공개키 파일은 다음과 같은 구조를 갖는다.
ssh-rsa AAAAB3...base64_encoded_key... comment
여기서:
ssh-rsa
: 사용된 암호화 알고리즘을 나타낸다.AAAAB3...base64_encoded_key...
: 공개키 자체의 base64 인코딩 값이다.comment
: 키 소유자 또는 키의 목적에 대한 설명이다.
authorized_keys 파일의 권한 설정은 매우 중요하다. 권한이 너무 느슨하면, SSH는 보안을 위해 그 파일을 무시할 수 있다. 파일 권한은 다음과 같이 설정하는 것이 권장된다.
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
이렇게 하면, 파일과 디렉토리의 소유자만이 읽기 및 쓰기 권한을 가지게 된다.
여러 키 관리하기
authorized_keys
파일은 여러 개의 공개키를 관리할 수 있다. 서버에서 특정 사용자에게 여러 클라이언트에서 접근할 수 있는 권한을 부여해야 할 경우, 각 키를 한 줄씩 추가하면 된다. 각 키에는 해당 키의 소유자나 목적을 나타내는 설명을 추가하는 것이 좋다.
예를 들어, 다음과 같은 형식으로 여러 키를 추가할 수 있다.
ssh-rsa AAAAB3... user1@hostname
ssh-ed25519 AAAAC3... user2@hostname
이와 같이 각 줄마다 키를 추가하면, 여러 클라이언트에서 비밀번호 없이 동일한 서버로 접근할 수 있다.
키와 명령어 제한
authorized_keys
파일에서 각 키에 대해 특정 명령어만 실행하도록 제한할 수 있다. 예를 들어, 특정 키로 서버에 접근한 후에 자동으로 실행할 스크립트를 지정할 수 있다. 이를 위해, 키 앞에 command
옵션을 추가할 수 있다. 예시는 다음과 같다.
command="/path/to/script.sh" ssh-rsa AAAAB3... user@hostname
이 설정은 해당 키로 로그인할 때마다 지정된 스크립트가 자동으로 실행되도록 한다. 명령어를 설정할 때에는 command
뒤에 원하는 스크립트나 명령어를 지정할 수 있으며, SSH 세션이 열릴 때마다 그 명령어가 실행된다.
키 사용 제한 설정
authorized_keys
파일에서 공개키별로 허용된 기능을 제한할 수도 있다. 예를 들어, 특정 키에 대해 포트 포워딩, X11 포워딩, 또는 에이전트 포워딩과 같은 기능을 비활성화할 수 있다. 이러한 제한을 설정하기 위해 no-port-forwarding
, no-X11-forwarding
, no-agent-forwarding
과 같은 옵션을 사용할 수 있다.
예시:
no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAAB3... user@hostname
이 설정을 통해 해당 키는 원격 포트 포워딩, X11 포워딩, 에이전트 포워딩 기능을 사용할 수 없게 된다. 이를 통해 서버의 보안을 더욱 강화할 수 있다.
키의 제한 시간 설정
특정 공개키에 대해 시간 제한을 설정하여, 일정 시간 이후에 자동으로 만료되도록 할 수 있다. 이 기능은 공개키가 특정 기간 동안만 유효해야 하는 상황에서 유용하다. 예를 들어, 임시 액세스 권한을 제공하는 경우 시간 제한 설정이 중요할 수 있다.
시간 제한은 다음과 같이 설정된다.
expiry-time="2023-12-31T23:59:59" ssh-rsa AAAAB3... user@hostname
이 설정은 2023년 12월 31일 23시 59분 59초에 해당 키가 만료되도록 한다. 만료 이후에는 해당 키로 인증을 시도하더라도 서버에서 이를 거부하게 된다.
원격 호스트 제한
또한, 특정 호스트에서만 키 인증을 허용하는 설정을 추가할 수 있다. 이를 통해, 특정 IP 주소나 도메인에서만 해당 키로 서버에 접근할 수 있도록 제한할 수 있다.
예시:
from="192.168.1.100" ssh-rsa AAAAB3... user@hostname
이 설정은 192.168.1.100 IP 주소에서만 해당 공개키를 사용하여 서버에 접근할 수 있도록 제한한다. 이 옵션은 특정 IP 대역에서만 접근을 허용하고자 할 때 유용하다.
여러 IP 주소를 사용할 경우 쉼표로 구분하여 설정할 수 있다.
from="192.168.1.100,192.168.1.101" ssh-rsa AAAAB3... user@hostname
이렇게 하면 두 개의 IP 주소에서만 해당 공개키를 사용한 접속이 허용된다.
환경 변수 제한
authorized_keys
파일에서 특정 환경 변수를 설정하거나 제한할 수 있다. 이를 통해 SSH 세션에서 실행될 때 적용될 환경을 제어할 수 있다. 예를 들어, environment
옵션을 사용하여 세션 동안 특정 환경 변수를 적용할 수 있다.
예시:
environment="MY_VAR=value" ssh-rsa AAAAB3... user@hostname
이 설정은 SSH 세션이 시작될 때 MY_VAR
환경 변수를 value
로 설정한다. 이 옵션은 다양한 목적으로 사용될 수 있으며, 특정 SSH 세션에서만 환경 변수를 적용하고자 할 때 유용하다.
명령어 실행 시 환경 변수 제한
또한, 환경 변수를 사용하여 특정 명령어 실행 시 환경 설정을 제어할 수 있다. 예를 들어, SSH 세션 내에서 사용자가 실행하는 명령어의 환경 변수를 제한하고 싶을 때 이를 적용할 수 있다. 예시로, 환경 변수에서 특정 경로나 권한을 제한하는 경우가 있다.
command="env -i /bin/echo Hello World" ssh-rsa AAAAB3... user@hostname
이 설정은 해당 키로 SSH 접속 시 환경 변수 없이 echo
명령만 실행되도록 제한하는 예이다.
기타 키 옵션
다양한 키 옵션을 사용하여 보안 및 사용 제어를 강화할 수 있다. 아래는 자주 사용되는 몇 가지 옵션이다.
no-pty
: 키로 인증을 받은 사용자가 쉘 세션을 얻지 못하도록 한다. 이 옵션은 터널링과 같이 쉘 접속이 필요 없는 경우에 유용하다.permitopen
: 특정 호스트와 포트로의 TCP 연결만 허용한다. 이는 포트 포워딩을 제한할 때 유용하다.
예시:
no-pty,permitopen="192.168.1.100:80" ssh-rsa AAAAB3... user@hostname
이 설정은 터널링 용도로 사용되며, 해당 키로 인증된 사용자가 192.168.1.100의 80번 포트로만 연결할 수 있도록 제한한다.
authorized_keys 파일의 자동화
대규모 서버 환경에서는 여러 서버에 동일한 공개키를 배포해야 할 때가 많다. 이를 자동화하기 위해 여러 가지 도구와 스크립트를 사용할 수 있다.
가장 일반적인 방법은 다음과 같다.
scp
또는rsync
를 사용하여 여러 서버에authorized_keys
파일을 복사한다.- Ansible과 같은 자동화 도구를 사용하여 여러 서버의
authorized_keys
파일을 동시에 관리한다.
예시로 Ansible을 사용한 authorized_keys
파일 배포는 다음과 같다.
- name: Add SSH key to authorized_keys
authorized_key:
user: "username"
key: "{{ lookup('file', '/path/to/public_key') }}"
state: present
이 Ansible 플레이북은 여러 서버의 사용자 계정에 공개키를 자동으로 추가해 준다.