Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

1Password SSH 에이전트로 로컬 SSH 키 안전하게 관리하기

최근 몇 년 사이 보안에 관심이 많아졌다. 완벽한 보안이란 없지만, 여러 환경 중 의외로 보안이 취약한 곳은 로컬 환경이다. 아무래도 개인 장비라 외부 접근이 기본적으로 차단되는 데다가 자주 사용해서 편의성도 중요하다 보니 로컬에는 많은 시크릿이 평문으로 저장되어 있다.

로컬에서 관리되는 시크릿은 다양하지만, 그중 정말 중요하면서도 평문으로 관리되는 것 중 하나가 SSH 키다. 비밀키는 보안의 핵심이지만 현실에서는 평문으로 관리되고 있어서 개인 장비를 분실하거나 해킹당하면 쉽게 유출될 수 있다.

1Password SSH 에이전트 설정

1Password는 비밀번호를 관리해 주는 게 핵심 기능이지만 몇 년 전부터 개발자를 위한 기능을 강화하고 있다. SSH 에이전트 기능은 나온 지 수년이 되었지만 생각만 하다가 이제야 제대로 설정했다.

1Password의 개발자 화면에서 SSH 에이전트, 개발자 환경, CLI, Watchtower 기능 카드가 표시되어 있다.

1Password의 개발자 메뉴에 들어가면 SSH 에이전트라는 메뉴가 보인다.

1Password 설정의 개발자 탭이 열려 있으며, 개발자 경험 표시와 활동 기록 옵션이 체크되어 있다.

혹시 개발자 메뉴가 안 보인다면 설정에서 개발자 기능을 켜야 한다.

SSH 에이전트 설정을 누르면 다음과 같은 안내가 나온다.

1Password가 디스크에 SSH 키 이름 저장을 허용할지 묻는 알림 창. ‘키 지문만 사용’과 ‘키 이름 사용’ 버튼이 보인다.

설명을 완전히 이해는 못했지만 키 지문으로는 키를 구분하기 어려우므로 키 이름을 사용하기로 했다.

1Password의 SSH 에이전트 설정 창에 ~/.ssh/config에 추가할 IdentityAgent 스니펫과 자동 편집 버튼이 표시되어 있다.

이는 ~/.ssh/config 설정인데, 해본 사람은 알겠지만 모든 SSH 호스트에 1Password SSH 에이전트를 사용하도록 하는 설정이다. 그래서 다른 호스트에서는 기존의 키 파일을 써야 한다면 호스트를 지정한 설정을 추가하면 된다.

1Password SSH 에이전트 설정 화면으로, 실행 중 상태와 사용 가능한 SSH 키가 없다는 안내가 표시되어 있다.

SSH config에 설정을 넣으면 에이전트가 실행 중으로 바뀐다.

SSH 접속에 1Password SSH 에이전트 사용하기

먼저 SSH에 사용할 키를 등록해야 한다.

비밀번호 관리 앱의 새 항목 창에서 SSH 키 항목을 만들고 있다. 개인 키 파일 드래그 영역과 추가 옵션, 저장 버튼이 보인다.

인식할 수 있는 이름을 주고 기존의 키를 드래그하면 된다.

개인 키 파일을 드래그해 가져오는 영역과 개인 키 추가 버튼이 보이며, 키 유형은 Ed25519로 선택되어 있다.

1Password에서 바로 키를 생성할 수도 있는데 Ed25519RSA로 만들 수 있다. 특별한 이유가 없다면 지금은 Ed25519로 만들면 된다. 키 크기도 훨씬 작고 검증 속도도 훨씬 빠르다. 나 같은 경우는 기본으로 쓰던 키가 너무 오래되어서 그런지 지원하지 않는 형식이라고 나와서 이 기회에 새로 키를 생성했다.

Git 커밋에 SSH 서명을 설정하라는 안내와 함께 Test key의 공개 키, 지문, 개인 키 상태, 키 유형이 표시되어 있다.

생성된 키의 공개키와 지문도 바로 볼 수 있다. GitHub를 사용하는 경우 GitHub 계정의 SSH and GPG keys 설정에서 공개 키를 SSH Authentication Key로 등록하면 된다. 1Password에서 Git 커밋 서명에도 사용하라고 안내하는데, 나 같은 경우는 GPG로 서명하고 있어서 따로 설정하진 않았다. 간단히 설명하면 Authentication Key는 git clone이나 git pull 등 Git 저장소를 SSH로 접속할 때 쓰는 키이고 Signing Key는 커밋할 때 서명을 추가해서 해당 커밋을 본인이 했음을 증명할 때 사용하는 키다.

터미널에서 GitHub 저장소를 클론하는 중 Ghostty가 1Password에 SSH 키 접근 권한을 요청하는 인증 창이 떠 있다.

이제 터미널에서 Git 저장소에 접근하면 1Password 화면이 나오고, 여기서 인증하면 정상적으로 클론할 수 있다. 이렇게 구성하면 로컬에 비밀키를 평문으로 보관하지 않고서 안전하게 비밀키를 사용할 수 있다.

1Password 설정의 개발자 메뉴가 열려 있고, 고급 옵션에서 승인 요청, 키 승인 기억, SSH 설정 항목을 조정할 수 있다.

1Password 설정에서 키 승인에 대한 유효기간을 얼마나 유지할지 등을 설정할 수 있다.

북마크 관리

Git이 아니어도 서버 접속에 사용하는 SSH 키는 당연히 1Password에서 사용할 수 있다.

macOS에서 Ghostty가 SSH 키 사용을 위해 1Password 접근 권한을 요청하는 확인 창이 떠 있다.

스크린샷에서는 해당 서버에 접속하는 화면을 보여줬지만, 앞서 ~/.ssh/config의 설정을 기억한다면 호스트를 *로만 설정했고 호스트별로 키를 식별하는 설정은 없었다는 것을 알 것이다. 실제로 어떤 기준인지는 모르지만 1Password에 등록한 SSH 키가 순서대로 하나씩 뜬다. 그래서 이름을 보고 해당 키가 아니면 거부하고, 사용할 키가 나오면 승인하면 된다. SSH의 구조 때문인지 키를 골라서 선택하는 게 아니라 이렇게만 동작한다. 이로 인해서 일반적으로 SSH 서버가 인증 시도를 6회로 제한하기 때문에 SSH 에이전트도 SSH 키가 6개 초과로 있으면 제대로 사용할 수 없는 문제가 생긴다.

그래서 한번 승인해서 사용하고 나면 아래처럼 활동 탭에서 그 기록을 볼 수 있다.

1Password SSH 에이전트의 활동 탭에 Ghostty에서 사용한 SSH 키와 최근 작업 시간이 표시되어 있다.

여기서 우측에 북마크 버튼이 있는데, 이걸 누르면 북마크로 저장된다.

SSH 키 관리 화면의 북마크 탭이 선택되어 있으며, 등록된 호스트와 SSH 키 항목에 연결 버튼이 표시된다.

북마크 저장해 두면 해당 호스트를 사용할 때는 1Password가 알아서 해당 키를 띄워주므로 자주 사용하는 키는 북마크로 등록해놔야 편하게 쓸 수 있다.

GitHub 멀티 계정을 사용하는 경우

앞에서 활동 탭을 보면 SSH 접속은 북마크 버튼이 있는데 Git 명령어에서는 북마크 버튼이 없는걸 볼 수 있다.

나는 업무용 GitHub과 개인용 GitHub을 따로 운영하고 있는데 경험상 이런 사람이 많지는 않지만 회사 사정 등 여러 이유로 내부 Git 저장소를 쓰는 등 여러 Git 호스팅 서비스에 인증을 해야 하는 경우가 있다. 여러 Git 호스팅을 쓰는 경우 ~/.gitconfig~/.ssh/config 설정이 둘다 필요한데 여기서는 사실상 ~/.ssh/config만 관련있다.

 1# ~/.ssh/config
 2
 3# work account
 4Host company.github.com
 5  HostName github.com
 6  User git
 7  IdentityFile ~/.ssh/work-private-key
 8
 9# personal account
10Host github.com
11  HostName github.com
12  User git
13  IdentityFile ~/.ssh/personal-github-key

위 설정은 두 개의 키를 각 호스트에 쓰는 가장 일반적인 경우의 설정이다. 취향에 따라 약간씩 다를 수 있지만 기본 구조는 똑같다. SSH가 호스트만으로 구분할 수 있기 때문에 호스트를 이용해서 다른 키를 사용하게 하는데 호스트가 아예 다르면 오히려 편하지만 여기서는 둘다 GitHub인 예시이므로 company.github.com이라는건 임의로 만들어 낸 주소다. 그래서 둘 다 GitHub이지만 회사 저장소를 사용할 때는 git remote add에서 github.com 대신 company.github.com으로 등록하면 실제로는 github.com으로 연결되면서 다른 키를 사용하게 된다.

1Password도 이 방식을 이용해서 멀티 계정을 사용하는 방법을 안내하고 있다.

github auth 화면에 공개 키, 지문, 개인 키, 키 유형 Ed25519 항목이 표시되어 있고 메뉴에서 다운로드가 선택되어 있다.

사용하는 키의 공개 키를 다운로드해서 ~/.ssh/ 아래에 저장한다.

 1# ~/.ssh/config
 2
 3Host *
 4  IdentityAgent "~/Library/Group Containers/2AAA333A2C.com.1password/t/agent.sock"
 5
 6# work account
 7Host company.github.com
 8  HostName github.com
 9  User git
10  IdentityFile ~/.ssh/company-github.pub
11  IdentitiesOnly yes
12
13# personal account
14Host github.com
15  HostName github.com
16  User git
17  IdentityFile ~/.ssh/personal-github.pub
18  IdentitiesOnly yes

그리고 위처럼 설정하면 공개키를 인식하고 해당키로 사용할 비밀키를 식별해서 정확히 원하는 키만 인증으로 뜨게 된다.

 1$ git clone git@github.com:outsideris/project.git
 2Cloning into 'project'...
 3remote: Enumerating objects: 199, done.
 4remote: Counting objects: 100% (199/199), done.
 5remote: Compressing objects: 100% (120/120), done.
 6remote: Total 199 (delta 87), reused 162 (delta 57), pack-reused 0 (from 0)
 7Receiving objects: 100% (199/199), 60.76 KiB | 467.00 KiB/s, done.
 8Resolving deltas: 100% (87/87), done.
 9
10$  git clone git@company.github.com:outsider-biz/test.git
11Cloning into 'test'...
12remote: Enumerating objects: 13, done.
13remote: Counting objects: 100% (13/13), done.
14remote: Compressing objects: 100% (6/6), done.
15remote: Total 13 (delta 1), reused 10 (delta 1), pack-reused 0 (from 0)
16Receiving objects: 100% (13/13), done.
17Resolving deltas: 100% (1/1), done.

호스트만 제대로 지정해주면 동시에 사용하는데 문제가 없다. 그리고 이는 1Password SSH 에이전트의 문제는 아니고 원래 SSH 키로만 사용할 때도 똑같다.

이로써 키가 유출될 걱정은 덜었고 새로운 장비를 사거나 할때도 키를 복사하는 과정이 필요했는데 이제는 1Password만 설치하면 바로 사용할 수 있게 되었다.

Valid HTML5 Valid CSS WCAG 2.1 AA tested