SSH를 통한 GnuPG(PGP) SmartCard를 Yubikey가 있는 VM에 연결

5862 단어
SSH를 통한 에이전트 포워딩(GPG(GNU Privacy Guard) 및 SSH).

이 주제에 대해 내가 찾은 대부분의 블로그 게시물은 5년 이상 된 것이었고 GnuPG 2.1 이전의 시간을 참조하고 있었습니다. GnuPG 2.1은 이 프로세스를 가능하고 안전하게 만드는 몇 가지 실제 변경 사항이 있는 곳이었습니다. 요즘에는 Ubuntu 20.04와 같은 LTS 배포판에도 GnuPG 2.2가 포함되어 있습니다. GnuPG 2.2는 아직 더 단순하고 더 적은 수의 후프를 통과해야 합니다.

내 목표는 간단해 보였습니다.
  • 내 노트북(macOS Monterey)에서..
  • SSH 에이전트로 내 EC-DSA 키 전달...
  • ..및 GPG 키(실제로는 스마트 카드이지만 중요하지 않음) ..
  • SSH를 통해 Linux VM에 연결하여 그곳에서 작업하고, 커밋에 서명하고, git+ssh:// 리포지토리
  • 를 복제할 수 있습니다.

    GPG 키(및 스마트 카드)를 SSH 인증 토큰으로 사용할 수 있지만 저는 그것에 관심이 없고 별도의 SSH 키와 GPG 키가 있으며 그 설정에 만족합니다.

    충분히 새로운 소프트웨어가 있는지 확인하십시오.




    # Workstation:
    $ gpg --version
    gpg (GnuPG) 2.3.4    # anything over 2.1 is fine
    
    # VM (ssh target)
    $ gpg --version
    gpg (GnuPG) 2.2.19
    


    관련 키 생성 또는 구성:



    스마트 카드



    범위 밖이지만 꽤 가능합니다. 다음 가이드를 따르세요.
  • https://support.yubico.com/hc/en-us/articles/360013790259-Using-Your-YubiKey-with-OpenPGP

  • GPG 키 생성




    $ gpg --gen-key
    


    실명과 사용자 이메일 주소를 요청하고 이를 완성한 다음 일부 출력을 표시하는 대화형 프로그램입니다. 중요한 부분은 긴 키 ID입니다.

    Real name: Example User
    Email address: [email protected]
    You selected this USER-ID:
        "Example User <[email protected]>"
    
    ..... snip .....
    
    pub   ed25519 2022-04-06 [SC] [expires: 2024-04-05]
          7B5CB440DA3A316537466897128986B90599B1B1
    uid                      Example User <[email protected]>
    sub   cv25519 2022-04-06 [E] [expires: 2024-04-05]
    


    이 경우7B5CB440DA3A3...는 키 ID입니다. 클립보드에 복사하거나 환경 변수로 내보냅니다. 이것이 많이 필요합니다.

    SSH 키 생성



    이것을 실행하고 프롬프트를 따르십시오 ...

    $ ssh-keygen 
    


    이것은 ~/.ssh/id_rsa 또는 ~/.ssh/id_ecdsa와 같은 것을 생성하거나 구성에 따라 무언가를 생성합니다.

    관련 소켓 주소 얻기




    # On your local machine:
    
    $ gpgconf --list-dirs agent-ssh-socket
    /Users/<your username>/.gnupg/S.gpg-agent.ssh
    $ gpgconf --list-dir agent-socket
    /Users/leehambley/.gnupg/S.gpg-agent
    $ gpgconf --list-dirs agent-extra-socket
    /Users/<your username>/.gnupg/S.gpg-agent.extra
    
    
    % On the remote machine:
    $ gpgconf --list-dirs agent-ssh-socket
    /run/user/<your numeric user id, probably>/gnupg/S.gpg-agent.ssh
    $ gpgconf --list-dirs agent-socket
    /run/user/<your numeric user id, probably>/gnupg/S.gpg-agent
    


    GPG 에이전트 및 SSH 에이전트 소켓은 자체 설명이 필요하지만 "추가"소켓은 독특합니다. 문서에서 다음을 참조하세요.

    Also listen on native gpg-agent connections on the given socket. The intended use for this extra socket is to setup a Unix domain socket forwarding from a remote machine to this socket on the local machine. A gpg running on the remote machine may then connect to the local gpg-agent and use its private keys. This enables decrypting or signing data on a remote machine without exposing the private keys to the remote machine.



    그런 다음 추가 소켓은 권한이 약간 적은 소켓으로 원격 컴퓨터가 로컬 GPG 에이전트를 완전히 제어하지 않고도 원격 컴퓨터로 안전하게 전달할 수 있습니다(일반 소켓과 마찬가지로).

    로컬 구성




    # ~/.ssh/config
    Host thevmweworkin
      # this is standard SSH config, mostly
      HostName 192.168.64.11
      User vagrant
      Port 22
      UserKnownHostsFile /dev/null
      StrictHostKeyChecking no
      PasswordAuthentication no
      IdentitiesOnly yes
      LogLevel FATAL
    
      # This is the GPG/SSH forwarding 
      RemoteForward /run/user/<your numeric user id, probably>/gnupg/S.gpg-agent /Users/<your username>/.gnupg/S.gpg-agent.extra
      RemoteForward /run/user/<your numeric user id, probably>/gnupg/S.gpg-agent.ssh /Users/<your username>/.gnupg/S.gpg-agent.ssh
      ForwardAgent yes
      ExitOnForwardFailure yes
    
    # ~/.gnupg/agent-config.conf
    cat ~/.gnupg/gpg-agent.conf
    default-cache-ttl 600
    max-cache-ttl 7200
    pinentry-program /opt/homebrew/bin/pinentry-mac            # brew install gnupg for this, or don't specify pin entry
    extra-socket /Users/<your username>/.gnupg/S.gpg-agent.extra  
    enable-ssh-support
    keep-display
    default-cache-ttl 600
    max-cache-ttl 7200
    keep-tty
    keep-display
    
    # Your ~/.zshrc or ~/.bash_profile, etc
    eval $(gpg-agent --daemon)
    


    다음을 실행하여 에이전트가 올바른 구성으로 실행/다시 시작되는지 확인하십시오.

    $ gpg-connect-agent reloadagent /bye   # will start an agent if you didn't have one running
    OK
    


    원격 구성



    서명 커밋을 요구하도록 Git을 구성합니다.

    $ git config [--global] commit.gpgsign true
    $ git config --global user.signingkey 34EC1A4D011E7FDFFD6E3722A4F823DC30FA9DA7!  # the exclamation mark makes Git use this key, and not try and detect a subkey to use
    


    이미 실행 중인 데몬의 로컬 소켓을 제거하고 오버바인딩할 수 있도록 SSH를 구성합니다.

    /etc/ssh/sshd_conf
    
    # add the following:
    # https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent
    StreamLocalBindUnlink yes
    


    키를 어딘가(Github, Gitlab)에 업로드하고 VM 공개 키체인에 업로드합니다.




    # From the host machine
    gpg --output public.pgp --armor --export 34EC1A4D011E7FDFFD6E3722A4F823DC30FA9DA7
    gpg --armor --export 34EC1A4D011E7FDFFD6E3722A4F823DC30FA9DA7 | pbcopy
    
    scp public.pgp thevm:~/public.gpg
    


    그런 다음 프로필로 이동하여 새 GPG 키를 프로필에 붙여넣습니다.

    모든 것이 작동하는지 확인

    좋은 웹페이지 즐겨찾기