원격 액세스를 위한 SSH 키 생성 및 보안 설정 방법
SSH(Secure Shell)는 원격 서버 및 시스템에 안전하게 연결하기 위한 표준 프로토콜입니다. 비밀번호 인증이 일반적이지만, SSH 키 쌍을 사용하면 훨씬 강력하고 편리하며 복원력 있는 인증 방법을 제공합니다. 이 포괄적인 가이드는 강력한 SSH 키 쌍을 생성하고, 암호 문구(passphrase)로 이를 보호하며, ssh-agent를 활용하여 원활하고 안전한 원격 액세스를 수행하는 과정을 안내합니다.
인프라의 보안을 유지하려면 키 관리를 이해하는 것이 중요합니다. 취약한 비밀번호를 암호화 키로 대체함으로써 무차별 대입 공격(brute-force attacks) 및 자격 증명 스터핑(credential stuffing)과 관련된 위험을 완화하고 안전한 원격 연결의 기반을 확립할 수 있습니다.
SSH 키 쌍 이해하기
SSH 키 쌍은 두 가지 구성 요소로 이루어져 있습니다.
- 개인 키(The Private Key): 이 키는 절대 공유되어서는 안 됩니다. 개인 키는 로컬 머신에 안전하게 보관되며 원격 서버에 사용자의 신원을 증명하는 데 사용됩니다.
- 공개 키(The Public Key): 이 키는 자유롭게 공유되며 액세스하려는 원격 서버의
~/.ssh/authorized_keys파일에 업로드됩니다. 서버는 이 키를 사용하여 개인 키가 생성한 서명을 확인합니다.
올바른 알고리즘 선택
키를 생성할 때는 현대적이고 강력한 암호화 알고리즘을 선택하는 것이 필수적입니다. RSA가 여전히 널리 사용되지만, Ed25519는 속도와 강력한 보안 보장 덕분에 자주 권장됩니다.
1단계: SSH 키 쌍 생성
ssh-keygen 유틸리티는 Linux, macOS, Windows(Git Bash 또는 WSL을 통해)에서 SSH 키 쌍을 생성하는 표준 도구입니다.
Ed25519 키 생성 (권장)
최신 Ed25519 키를 생성하려면 다음 명령을 사용하십시오. 키 유형(-t ed25519)을 지정하고, 키의 용도나 소유자를 식별하는 데 도움이 되는 주석(-C)을 제공합니다.
ssh-keygen -t ed25519 -C "[email protected]_or_host_name"
프롬프트가 표시되면:
- 키를 저장할 파일을 입력하십시오(Enter file in which to save the key): Enter를 눌러 기본 위치(
/home/user/.ssh/id_ed25519)를 수락합니다. - 암호 문구를 입력하십시오(권장)(Enter passphrase (recommended)): 항상 강력한 암호 문구를 설정하십시오. 이는 개인 키를 암호화하므로, 누군가 파일을 훔치더라도 암호 문구 없이는 사용할 수 없습니다.
RSA 키 생성 (대안)
매우 오래된 시스템과의 호환성이 필요한 경우, 충분한 키 길이(최소 4096비트)를 지정하여 RSA 키를 생성할 수 있습니다.
ssh-keygen -t rsa -b 4096 -C "your_rsa_key_comment"
키 출력 파일
키 생성 후 (기본값 가정 시) ~/.ssh/ 디렉토리에 두 개의 파일이 생성됩니다.
id_ed25519(또는id_rsa): 사용자의 개인 키id_ed25519.pub(또는id_rsa.pub): 사용자의 공개 키
보안 모범 사례:
.pub확장자가 없는 파일은 절대 공유하지 마십시오. 개인 키에 대해 제한적인 권한을 설정하십시오 (chmod 600 ~/.ssh/id_ed25519).
2단계: 공개 키를 서버로 복사
원격 서버가 액세스를 허용하려면 ~/.ssh/authorized_keys 파일에 사용자의 공개 키를 가지고 있어야 합니다.
ssh-copy-id 사용 (가장 쉬운 방법)
ssh-copy-id 유틸리티는 원격 서버에서 디렉토리 생성 및 권한 설정을 처리하는 과정을 자동화합니다. 이 초기 설정을 위해서는 비밀번호로 마지막 한 번 인증해야 합니다.
ssh-copy-id user@remote_host_ip
성공하면, 명령은 키가 추가되었음을 알려줍니다. 이제 로그인을 시도할 수 있습니다.
수동 복사 (ssh-copy-id를 사용할 수 없는 경우)
ssh-copy-id를 사용할 수 없는 경우, 공개 키 내용을 수동으로 추가할 수 있습니다. 먼저 공개 키를 표시합니다.
cat ~/.ssh/id_ed25519.pub
그런 다음, 비밀번호를 사용하여 원격 서버에 로그인하고 그 출력 내용을 authorized_keys 파일에 추가합니다.
# 원격 서버에서
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# <PASTE_YOUR_PUBLIC_KEY_HERE>를 실제 키 내용으로 대체하십시오
echo "<PASTE_YOUR_PUBLIC_KEY_HERE>" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
3단계: ssh-agent로 액세스 보안 유지
서버에 연결할 때마다 암호 문구를 입력하는 것은 번거롭습니다. ssh-agent는 복호화된 개인 키를 메모리에 안전하게 보관하여, 암호 문구를 반복적으로 입력할 필요 없이 키를 사용할 수 있게 해주는 백그라운드 프로그램입니다.
ssh-agent 시작 및 사용
-
에이전트가 실행 중인지 확인: 대부분의 최신 Linux/macOS 시스템에서는 로그인할 때 에이전트가 자동으로 시작됩니다. 환경 변수를 확인하여 상태를 점검할 수 있습니다.
bash echo $SSH_AUTH_SOCK -
에이전트에 키 추가:
ssh-add명령을 사용하여 개인 키를 로드합니다. 암호 문구는 단 한 번만 입력하라는 메시지가 표시됩니다.```bash
ssh-add ~/.ssh/id_ed25519/home/user/.ssh/id_ed25519에 대한 암호 문구 입력: ****
Identity added: /home/user/.ssh/id_ed25519 (comment)
```
-
로드된 키 확인:
bash ssh-add -l
이제 ssh user@remote_host_ip를 실행하면 에이전트가 보유한 키를 사용하여 연결이 인증되며, (에이전트 세션이 끝날 때까지) 암호 문구를 다시 묻지 않습니다.
ssh-agent 중요 참고 사항
- 세션 종속성: 에이전트에 로드된 키는 일반적으로 현재 터미널 세션 또는 데스크톱 로그인 세션에만 사용할 수 있습니다. 로그아웃 후 다시 로그인하면
ssh-add를 다시 실행해야 합니다. - 키 수명:
-t플래그를 사용하여 에이전트에 보관되는 키의 최대 수명을 설정할 수 있습니다 (예:ssh-add -t 1h ~/.ssh/id_ed25519는 키를 1시간 동안 로드 상태로 유지합니다).
고급 보안: 비밀번호 인증 비활성화
키 기반 인증이 필요한 모든 서버에서 완벽하게 작동하는 것을 확인했다면, 가장 강력한 보안 조치는 비밀번호 기반 로그인을 완전히 비활성화하는 것입니다. 이는 비밀번호에 대한 무차별 대입 공격을 방지합니다.
- 키를 사용하여 SSH를 통해 서버에 연결합니다.
-
일반적으로
/etc/ssh/sshd_config에 위치한 SSH 데몬 구성 파일을 편집합니다.bash sudo nano /etc/ssh/sshd_config -
다음 지시문을 찾아 설정합니다.
```config
이것이 yes로 설정되어 있는지 확인합니다 (일반적으로 기본값)
PubkeyAuthentication yes
비밀번호 로그인 비활성화
PasswordAuthentication no
``` -
SSH 서비스를 재시작하여 변경 사항을 적용합니다.
```bash
sudo systemctl restart sshd # systemd 기반 시스템 (대부분의 최신 Linux)또는
sudo service ssh restart # 구형 시스템
```
경고: 비밀번호 인증을 비활성화하기 전에, 새 키를 사용하여 최소한 한 번 성공적으로 로그인했는지 확인하십시오. 구성 오류로 인해 잠기는 것은 일반적이지만 복구 가능한 실수이며, 콘솔 또는 대체 액세스가 필요합니다.
요약 및 다음 단계
SSH 키를 생성하고 관리하는 것은 안전한 시스템 관리를 위한 기본적인 기술입니다. 이 단계들, 즉 최신 Ed25519 키 생성, 강력한 암호 문구로 개인 키 보호, 대상 서버에 공개 키 안전하게 설치, 그리고 ssh-agent 활용을 따르면 매우 안전하고 효율적인 인증 메커니즘을 확립할 수 있습니다.
다음 단계:
- 액세스하는 모든 주요 시스템 또는 서비스에 대해 고유한 키 쌍을 생성하십시오.
- 주요 서버의
authorized_keys파일을 정기적으로 감사하십시오. - 가능하다면 서로 다른 키 쌍에 대해 다른 암호 문구를 사용하거나, 최소한 복잡하게 유지하십시오.