Sådan styres flere SSH-nøgler

Det er sikkert at sige, at de fleste udviklere i websfæren på et tidspunkt har stødt på SSH. SSH er en af ​​de mest anvendte protokoller til sikker dataudveksling. Du bruger SSH til at oprette forbindelse til eksterne servere, som også inkluderer administration af din kode ved hjælp af Git og synkronisering med eksterne arkiver.

Selvom det betragtes som en god praksis at have et privat-offentligt nøglepar pr. Enhed, skal du nogle gange bruge flere nøgler, og / eller du har uortodokse nøglenavne.

Du bruger muligvis et SSH-nøglepar til at arbejde på din virksomheds interne projekter, men du bruger muligvis en anden nøgle til at få adgang til nogle virksomhedsklients servere. Du bruger endda en anden nøgle til at få adgang til din egen private server.

Administration af SSH-nøgler kan blive besværlig, så snart du har brug for en anden nøgle. Jeg håber, at denne artikel vil være til hjælp for alle, der har problemer med SSH-nøglehåndtering.

Jeg antager, at læseren har grundlæggende viden om Git og SSH. De fleste eksempler i hele artiklen bruger Git. Selvfølgelig gælder alt dette for enhver anden SSH-kommunikation. Når det er sagt, er der nogle Git-specifikke tricks inkluderet.

Strop ind, her går vi!

Beskæftiger sig med en SSH-nøgle

Lad os først se, hvordan din arbejdsgang kan se ud, før vi har flere taster at bekymre dig om.

Du har gemt en privat nøgle ~/.ssh/id_rsamed en tilsvarende offentlig nøgle ~/.ssh/id_rsa.pub.

Lad os forestille os, at du vil skubbe / trække kodeændringer til / fra en ekstern Git-server - sig GitHub, hvorfor ikke. For at gøre det skal du først tilføje din offentlige nøgle til GitHub.

Jeg vil ikke gå over dette trin, det skal være let nok at finde ud af, hvordan man gør det. Jeg har også antaget, at dit navn er Steve, og du arbejder på et tophemmeligt projekt, der bruger Raspberry Pies til at snuse netværkstrafik.

For at starte dit arbejde skal du klone et git-arkiv ved hjælp af SSH:

git clone [email protected]:steve/raspberry-spy.git

I dette øjeblik vil GitHub være som: “Yo, dette er et privat arkiv! Vi er nødt til at kryptere trafik ved hjælp af denne offentlige nøgle, jeg har her, og din private nøgle. ”

Du har tilføjet den offentlige nøgle til din profil på GitHub, men SSH skal på en eller anden måde finde ud af, hvor din tilsvarende private nøgle er placeret.

Da vi ikke har nogen anelse om, hvilken privat nøgle der skal bruges, når SSH-ind i [email protected], forsøger SSH-klienten at finde en nøgle i standardplacering, hvilket er ~/.ssh/id_rsa- det er hans bedste gæt. Hvis der ikke er nogen fil det sted, får du en fejl:

Cloning into 'raspberry-spy'... Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.

Hvis du har gemt en privat nøgle i filen ~/.ssh/id_rsa, bruger SSH-klienten den private nøgle til kommunikationskryptering. Hvis denne nøgle er kodeord (som den burde være), bliver du bedt om en adgangskode som sådan:

Enter passphrase for key '/Users/steve/.ssh/id_rsa':

Hvis du indtaster den korrekte adgangssætning, og hvis den private nøgle faktisk er den, der svarer til den offentlige nøgle, som du vedhæftede til din profil, går alt fint, og lageret klones med succes.

Men hvad nu hvis du navngav din nøgle forskelligt (f.eks. ~/.ssh/_id_rsa)? SSH-klienten kan ikke bestemme, hvor den private nøgle er gemt. Du får den samme Permission denied ...fejl som før.

Hvis du vil bruge en privat nøgle, som du navngav forskelligt, skal du tilføje den manuelt:

ssh-add ~/.ssh/_id_rsa

Efter indtastning af adgangskoden kan du kontrollere, om nøglen blev føjet til ssh-agent(SSH-klient) ved at udføre ssh-add -l. Denne kommando viser alle nøgler, der i øjeblikket er tilgængelige for SSH-klienten.

Hvis du prøver at klone lageret nu, vil det lykkes.

Så langt så godt?

Hvis du er opmærksom, begynder du måske at bemærke nogle potentielle problemer.

For det første, hvis du genstarter din computer, ssh-agentgenstarter, og du bliver nødt til at tilføje dine ikke-standardnavne nøgler ved at bruge det ssh-addhele igen, ved at skrive adgangskoder og alt det kedelige.

Kan vi automatisere tilføjelse af nøgler eller på en eller anden måde angive, hvilken nøgle vi skal bruge, når vi får adgang til bestemte servere?

Kan vi på en eller anden måde gemme adgangskoder, så vi ikke behøver at indtaste dem hver gang? Hvis der kun var noget som en nøglering til at gemme adgangskodebeskyttede SSH-nøgler?.

Vær sikker på, der er svar på alle disse spørgsmål.

Gå ind, SSH config

Som det viser sig, er SSH-konfigurationsfil en ting, en ting der kan hjælpe os. Det er en konfigurationsfil pr. Bruger til SSH-kommunikation. Opret en ny fil: ~/.ssh/configog åbn den til redigering.

Administration af brugerdefinerede SSH-nøgler

Den første ting, vi skal løse ved hjælp af denne configfil, er at undgå at skulle tilføje brugerdefinerede SSH-nøgler ved hjælp af ssh-add. Forudsat at din SSH-nøgle er navngivet ~/.ssh/_id_rsa, skal du føje følgende til configfilen:

Host github.com HostName github.com User git IdentityFile ~/.ssh/_id_rsa IdentitiesOnly yes

Sørg nu for, at ~/.ssh/_id_rsadet ikke er i ssh-agentved at udføre ssh-add -D. Denne kommando fjerner alle nøgler fra den aktuelt aktive ssh-agentsession. Sessionen nulstilles hver gang du logger ud eller genstarter (eller hvis du dræber ssh-agentprocessen manuelt). Vi kan "simulere" genstart ved at udføre den nævnte kommando.

Hvis du prøver at klone dit GitHub-arkiv nu, vil det være det samme som hvis vi tilføjede nøglen manuelt (som vi gjorde før). Du bliver bedt om adgangskode:

git clone [email protected]:steve/raspberry-spy.git Cloning into 'raspberry-spy'... Enter passphrase for key '/Users/steve/.ssh/_id_rsa':

Du vil have bemærket, at nøglen, hvis adgangskode vi bliver bedt om, er den samme nøgle, som vi specificerede i vores configfil. Efter indtastning af den korrekte SSH-nøgleadgangskode klares lageret med succes.

Bemærk: hvis du efter en vellykket kloning prøver git pull, bliver du bedt om adgangskode igen. Vi løser det senere.

Det er vigtigt, at Host github.comfra configog github.comfra URI [email protected]:steve/raspberry-spy.gitmatcher. Du kan også skifte configtil at være Host mygithubog klone ved hjælp af URI [email protected]:steve/raspberry-spy.git.

This opens the floodgates. As you are reding this, your mind is racing and thinking about how all your troubles with SSH keys are over. Here are some useful configuration examples:

Host bitbucket-corporate HostName bitbucket.org User git IdentityFile ~/.ssh/id_rsa_corp IdentitiesOnly yes

Now you can use git clone [email protected]:company/project.git

Host bitbucket-personal HostName bitbucket.org User git IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes

Now you can use git clone [email protected]:steve/other-pi-project.git

Host myserver HostName ssh.steve.com Port 1111 IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes User steve IdentitiesOnly yes

Now you can SSH into your server using ssh myserver. How cool is that? You do not need to enter port and username manually every time you execute ssh command.

Bonus: Per-repository settings

You can also define which specific key should be used for certain repository, overriding anything in SSH config. Specific SSH command can be defined by setting sshCommand under core in /.git/config. Example:

[core] sshCommand = ssh -i ~/.ssh/id_rsa_corp

This is possible with git 2.10 or later. You can also use this command to avoid editing the file manually:

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_corp'

Password managemet

Last piece of the puzzle is managing passwords. We want to avoid having to enter password every time when SSH connection is initiating. To do so, we can utilize keychain management software that comes with MacOS and various Linux distributions.

Start by adding your key to the keychain by passing -K option to the ssh-add command:

ssh-add -K ~/.ssh/id_rsa_whatever

Now you can see your SSH key in the keychain. On MacOS it looks something like this:

Adgang til nøglering

If you remove the keys from ssh-agent via ssh-add -D (this will happen when you restart your computer, as mentioned before) and try SSH-ing, you will be prompted for password again. Why? We just added the the key to the keychain. If you check Keychain Access again, you will notice that the key you added using ssh-add -K is still in the keychain. Weird, huh?

Det viser sig, at der er endnu en bøjle at hoppe igennem. Åbn din SSH- configfil, og tilføj følgende:

Host * AddKeysToAgent yes UseKeychain yes

Nu ser SSH efter nøgle i nøglering, og hvis den finder den, bliver du ikke bedt om adgangskode. Nøgle føjes også til ssh-agent. På MacOS fungerer dette på MacOS Sierra 10.12.2 eller nyere. På Linux kan du bruge noget lignende, gnome-keyringog det fungerer muligvis selv uden denne sidste ændring af SSH config. Hvad angår Windows - hvem ved, ikke?

Jeg håber nogen fandt dette nyttigt. Gå nu og konfigurer din SSH- configfil!

Lær mere om SSH:

  • Den ultimative guide til SSH-nøgler
  • En top-down introduktion til SSH