Update 2023-09-15 Using Control Master

This is my preferred approach now, as it is simple to use, and doesn’t come with the added security issues of having authentication keys lying around.

It utilises an SSH capability called ControlMaster, which multiplexes multiple SSH sessions over the same connection. Only the initial connection requires authentication, then, all subsequent SSH or SCP calls to the same account+host will use the authenticated connection.

Step 1 is to setup you SSH to use ControlMaster. In ~/.ssh/config add

host *
  ControlMaster auto
  ControlPath ~/.ssh/ssh_mux_%h_%p_%r

Then, your first connection will be az ssh vm --ip xx.yy.zz.aa.

Once you connect, note your username, either from the prompt, or use whoami.

Now, for your scp or ssh call connect to [email protected]@xx.yy.zz.aa.

The ControlMaster will persist until the last connection closes.

Generating SSH Config

Azure support Azure AD managed SSHing into Linux VMs using a command such as az ssh vm --ip 10.1.1.1. This includes controlling sudo access using Azure AD groups. Super useful.

However, in order to get the file transfer component of ssh (scp) to work, we need to jump through a couple of poorly documented hoops.

First, we need to generate an ssh config for each VM we want to scp into. This will include the Azure certificate which is required to connect, in addition to the SSH key

az ssh config --ip 10.1.1.1 --file azuressh.config

This can now be used for vanilla SSH, and for scp using the -F flag.

ssh -F azuressh.config 10.1.1.1
scp -F azuressh.config 10.1.1.1:somefile .

Note, this command generates the keys and certificates into a temporary directory, so they will be cleaned up on reboot. It is possible to specify the output path for these files as part of the az ssh config command, but I’ll leave that up to you to figure our.

Just remember to secure these files, as they provide passwordless access to a remote machine.