SSH 에이전트 및 에이전트 포워딩 마스터하기: 원활한 인증을 위한 길잡이
ssh-agent와 에이전트 포워딩을 안전하게 사용하여 암호가 설정된 키, 점프 호스트, 다중 홉 SSH 워크플로우를 효율적으로 처리하는 방법을 알아봅니다.
SSH 에이전트 및 에이전트 포워딩 마스터하기: 원활한 인증을 위하여
Secure Shell(SSH) 키 인증은 재사용 가능한 비밀번호보다 안전하지만, 여러 호스트에 연결할 때 암호를 매번 입력해야 하는 불편함이 있습니다. ssh-agent는 현재 로그인 세션 동안 잠금 해제된 키를 사용 가능하게 유지하여 이 문제를 해결하며, 에이전트 포워딩을 통해 신뢰할 수 있는 점프 호스트를 거쳐 로컬 키를 사용할 수 있습니다. 신중하게 사용하면 개인 키를 서버에 복사하지 않고도 더 원활한 SSH 접근이 가능합니다.
SSH 에이전트 이해하기
ssh-agent는 개인 SSH 키를 메모리에 안전하게 보관하는 백그라운드 프로그램으로, 복호화된 상태로 사용할 준비가 되어 있습니다. 원격 서버에 연결할 때마다 암호를 입력할 필요 없이, 에이전트에 키를 추가할 때 한 번만 입력하면 됩니다. 이는 암호 보호가 제공하는 보안을 희생하지 않으면서 워크플로우 효율성을 크게 향상시킵니다.
SSH 에이전트 시작 및 관리
에이전트를 시작하고 해당 소켓을 셸 세션에서 사용할 수 있게 만드는 과정은 매우 중요합니다. 대부분의 최신 Linux 및 macOS 시스템에서는 시스템 초기화 스크립트나 데스크톱 환경이 자동으로 에이전트를 시작합니다.
수동으로 시작해야 하는 경우 다음 명령어 시퀀스를 사용하세요. 이렇게 하면 현재 셸 세션에 필요한 환경 변수(SSH_AUTH_SOCK 및 SSH_AGENT_PID)가 올바르게 설정됩니다:
# 에이전트를 시작하고 필요한 환경 변수를 출력합니다
eval "$(ssh-agent -s)"
에이전트에 키 추가하기
에이전트가 실행 중이면 ssh-add 명령을 사용하여 개인 키를 메모리에 로드합니다. 키가 암호로 보호되어 있는 경우 암호를 입력하라는 메시지가 표시됩니다.
예: 기본 키 추가
ssh-add
# 암호를 입력하라는 메시지가 표시되면 입력합니다
# Identity added: /home/user/.ssh/id_ed25519 (user@localbox)
예: 특정 키 파일 추가
ssh-add ~/.ssh/my_project_key
로드된 키 확인하기
-l 플래그를 사용하여 에이전트가 현재 관리 중인 키를 확인할 수 있습니다:
ssh-add -l
# 출력 예시:
2048 SHA256:abcdef1234567890... user@localbox (RSA)
개인 키에는 반드시 암호를 사용하세요. 에이전트는 세션 중에 반복적인 암호 입력을 방지할 뿐, 디스크에 있는 보호되지 않은 개인 키를 더 안전하게 만들지는 않습니다.
SSH 에이전트 포워딩 이해하기
에이전트 포워딩은 로컬 ssh-agent에 로드된 키를 사용하여 첫 번째 원격 호스트에서 연결하는 두 번째 원격 호스트에 인증할 수 있게 해주는 강력한 기능입니다.
이는 노트북에서 배스천 호스트로 연결한 다음, 배스천 호스트에서 내부 서버로 연결하는 다중 홉 워크플로우에 유용합니다.
에이전트 포워딩 작동 방식
에이전트 포워딩을 활성화한 상태로 호스트 A에 연결하면 SSH는 호스트 A에 특수 UNIX 도메인 소켓을 생성합니다. 이 소켓은 프록시 역할을 합니다. 호스트 A에서 대상 호스트 B로 SSH를 시도하면 호스트 A의 SSH 클라이언트는 인증 요청을 이 프록시 소켓을 통해 로컬 머신에서 실행 중인 ssh-agent로 전달합니다. 에이전트는 저장된 개인 키를 사용하여 암호화 챌린지를 처리하고 성공 신호를 다시 보내 호스트 B에 대한 인증을 완료합니다.
개인 키는 로컬 머신을 떠나지 않습니다. 원격 호스트는 키 파일 자체가 아닌 임시 에이전트 소켓에 대한 액세스 권한을 받습니다.
에이전트 포워딩 활성화하기
원격 호스트에 연결할 때 에이전트 포워딩을 활성화하려면 ssh 명령에 -A 플래그를 사용하세요:
ssh -A user@bastion-host
또한 ~/.ssh/config에서 신뢰할 수 있는 하나의 호스트에 대해 설정할 수 있습니다:
Host bastion-host
Hostname 192.168.1.100
User myuser
ForwardAgent yes
에이전트 포워딩 테스트하기
포워딩이 활성화된 배스천 호스트에 성공적으로 연결한 후, 원격 머신에서 에이전트 소켓을 사용할 수 있는지 테스트합니다. SSH_AUTH_SOCK 환경 변수의 존재 여부를 확인하거나 원격 머신에서 ssh-add -l을 사용할 수 있습니다:
배스천 호스트에서:
# 키가 포워딩되었는지 확인합니다 (로컬에서 실행 중인 에이전트가 응답해야 함)
ssh-add -l
# 성공하면 로컬 에이전트가 관리하는 키가 표시됩니다.
이제 배스천 호스트에서 내부 대상 호스트로 키 인증을 사용하여 SSH할 수 있으며, 배스천 호스트에 개인 키 파일이 있을 필요가 없습니다:
배스천 호스트에서:
ssh user@target-host
# 포워딩된 에이전트 소켓을 통해 로컬 키를 사용하여 인증이 원활하게 이루어집니다.
보안 고려 사항
에이전트 포워딩은 편리하지만 위험 프로필을 변경합니다.
원격 호스트에서 포워딩이 활성화되어 있으면 해당 호스트의 루트 액세스 권한을 가진 사용자가 SSH 세션이 열려 있는 동안 포워딩된 에이전트 소켓에 액세스할 수 있습니다. 개인 키를 에이전트에서 읽을 수는 없지만, 에이전트에 액세스할 수 있는 다른 서버에 대한 인증 챌린지에 서명하도록 요청할 수 있습니다.
완화 전략
- 기본적으로 포워딩 비활성화: 특정 다중 홉 작업이 필요할 때만
-A를 사용하세요. ~/.ssh/config에서 포워딩 제한: 신뢰할 수 있는 점프 서버에 대해서만 포워딩을 활성화하세요.Host trusted-jump ForwardAgent yes Host untrusted-server ForwardAgent no- 민감한 키에 대해 확인 요구:
ssh-add -c ~/.ssh/keyname은 에이전트가 해당 키를 사용하기 전에 확인을 요청합니다. 이는 포워딩된 에이전트가 관리하지만 완전히 신뢰하지 않는 호스트에 노출될 때 유용합니다. - 포워딩이 필요하지 않은 경우
ProxyJump선호: 배스천을 통해 개인 호스트에만 도달하려는 경우ssh -J user@bastion user@target을 사용하면 에이전트를 배스천에 포워딩하지 않아도 됩니다.
에이전트 수명 주기 관리
특히 수동으로 관리할 때는 에이전트의 수명 주기를 관리하는 것이 좋습니다. 터미널 세션을 종료하면 에이전트가 백그라운드에서 계속 실행되어 리소스를 소비하고 소켓을 활성 상태로 유지할 수 있습니다.
키 제거하기
에이전트 메모리에서 특정 키를 제거하려면:
ssh-add -d ~/.ssh/my_project_key
에이전트에서 모든 키를 제거하려면:
ssh-add -D
에이전트 중지하기
에이전트 프로세스를 종료하고 메모리에서 로드된 모든 키를 지우려면:
ssh-agent -k
이 명령은 관련 환경 변수를 해제하고 에이전트 프로세스를 종료하는 셸 명령을 출력합니다. eval "$(ssh-agent -s)"로 에이전트를 시작한 경우 eval "$(ssh-agent -k)"를 실행하여 현재 셸에 해당 정리를 적용하세요.
핵심 요점
일상적인 키 관리를 위해 ssh-agent를 사용하고, 에이전트 포워딩은 진정으로 필요한 신뢰할 수 있는 점프 호스트에 대해서만 예약하세요. 간단한 배스천 액세스의 경우 먼저 ProxyJump를 시도하고, 포워딩된 에이전트의 경우 세션을 짧게 유지하고 ssh-add -d 또는 ssh-add -D로 더 이상 필요하지 않은 키를 제거하세요.