Sometimes, you’ll be faced with writing a script that goes off, collects some information from a remote system, and copies that information to another remote system for off-site storage. Such an example would be the configuration information of remote unix systems, a backup server or the configuration of a san/nas storage device on your network.
In order to run this job as an automated task, you need to be able to connect securely to the remote systems before copying configuration data over the network, but don’t want to have to enter passwords manually, and shouldn’t include passwords in your scripts either (for security reasons), so how do you do it?
You can use ssh keys to do it.
ssh keys are a pair of keys that can be generated for any given user account (called public key and private key), and the private key is then securely copied to the remote system, so that when a connection attempt is made to that remote system by the user offering their public key, the two keys are put together on the remote system to form a successful means of authenticating to that remote system, just like a normal password, but it’s all done by the systems with no interaction required by the user.
If that sounded complicated, it wasn’t meant to. And it isn’t. In summary, setting this passwordless authentication mechanism up goes like this…
1. Generate keys for my user using ssh-keygen
2. Copy the keys to the remote system using ssh-copy-id
3. ssh to the remote system to test. Voila!
A real-world working example of copying the contents of someuser‘s ~/.ssh/id-rsa.pub public key to a remote nas device’s /home/someuser/.ssh/authorized-keys file is shown below with the input required from the sysadmin shown in bold.
email@example.com 5$ su – someuser
[someuser@myserver ~]$ pwd
[someuser@myserver ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/local/home/someuser/.ssh/id_rsa):
Created directory ‘/local/home/someuser/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /local/home/someuser/.ssh/id_rsa.
Your public key has been saved in /local/home/someuser/.ssh/id_rsa.pub.
The key fingerprint is:
[someuser@myserver ~]$ cd .ssh
[someuser@myserver ~/.ssh]$ ls
[someuser@myserver ~/.ssh]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mynas
Warning: Permanently added ‘mynas,192.168.0.69’ (RSA) to the list of known hosts.
A customized version of the Linux operating system is used on the
EMC(R) VNX(TM) Control Station. The operating system is
copyrighted and licensed pursuant to the GNU General Public License
(“GPL”), a copy of which can be found in the accompanying
documentation. Please read the GPL carefully, because by using the
Linux operating system on the EMC Celerra you agree to the terms
and conditions listed therein.
EXCEPT FOR ANY WARRANTIES WHICH MAY BE PROVIDED UNDER THE TERMS AND
CONDITIONS OF THE APPLICABLE WRITTEN AGREEMENTS BETWEEN YOU AND EMC,
THE SOFTWARE PROGRAMS ARE PROVIDED AND LICENSED “AS IS” WITHOUT
WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
NOT LIMITED TO, THE IMPLIED MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE. In no event will EMC Corporation be liable to
you or any other person or entity for (a) incidental, indirect,
special, exemplary or consequential damages or (b) any damages
whatsoever resulting from the loss of use, data or profits,
arising out of or in connection with the agreements between you
and EMC, the GPL, or your use of this software, even if advised
of the possibility of such damages.
EMC, VNX, Celerra, and CLARiiON are registered trademarks or trademarks of
EMC Corporation in the United States and/or other countries. All
other trademarks used herein are the property of their respective
EMC VNX Control Station Linux release 3.0 (NAS 7.0.53)
Warning: No xauth data; using fake authentication data for X11 forwarding.
Now try logging into the machine, with “ssh ‘mynas'”, and check in:
to make sure we haven’t added extra keys that you weren’t expecting.
myserver.cyberfella.co.uk 102# cd /etc
myserver.cyberfella.co.uk 103# vi cron.allow
myserver.cyberfella.co.uk 104# su – someuser
[someuser@myserver ~]$ crontab -e
no crontab for someuser – using an empty one
crontab: installing new crontab
[someuser@myserver ~]$ crontab -l
45 23 * * * /local/home/someuser/myscript.sh >/dev/null 2>&1
Example commands in myscript.sh that work due to the passwordless authentication mechanism being in place are…
Backup myNAS information…
/usr/bin/scp -p -o ConnectTimeout=300 someuser@mynas:/celerra/backup/nasdb_backup.1.tar.gz /home/someuser/nasdb_backup.1.tar.gz
/usr/bin/ssh -q someuser@mynas “export NAS_DB=/nas;/nas/bin/server_mount mydatamover ” | grep rw | grep -v “^root_fs_” >> ~/mynas_db_backup
/usr/bin/ssh -q someuser@mynas “export NAS_DB=/nas;/nas/bin/server_export ALL ” >> ~/mynas_db_backup
/usr/bin/ssh -q someuser@mynas “export NAS_DB=/nas;/nas/bin/nas_replicate -list ” >> ~/mynas_db_backup
Backup myNAS Network Information…
/usr/bin/ssh -q someuser@mynas “export NAS_DB=/nas;/nas/bin/server_ifconfig server_2 -all ” >> ~/mynas_db_backup
Backup myNAS Quota information…
/usr/bin/ssh -q someuser@mynas “export NAS_DB=/nas;/nas/bin/nas_quotas -list -mover mydatamover” >> ~/mynas_db_backup
/usr/bin/ssh -q someuser@mynas “export NAS_DB=/nas;/nas/bin/nas_quotas -report -mover mydatamover” >> ~/mynas_db_backup
/usr/bin/ssh -q someuser@mynas “export NAS_DB=/nas;/nas/bin/server_df ALL | grep -iv CKPT” >> ~/mynas_db_backup
Adding SSH Key to Cisco MDS Switch
If you have a script that goes off to a Cisco MDS switch, retreives some information and writes it back to a server, then you’d need to copy the ssh key to the switch, just like you would to a remote unix server for the purpose of passwordless authentication during the initial ssh connection. Adding a public key to a cisco switch is done like this…
username admin sshkey ssh-rsa <contents of id-rsa.pub here>
It’ll tell you if the key has been added successfully or not.
Deleting a SSH Key from Cisco MDS Switch
To subsequently remove an ssh public key from the switch, use…
no username admin sshkey ssh-rsa <contents of id-rsa.pub here>
Troubleshooting SSH connections
You may find yourself having issues with connecting as root or any other user for that matter. Despite having created and copied you public keys to the remote systems, you’re still being prompted for passphrases or passwords for the user, defeating the whole point of setting up passwordless authentication.
Here’s a quick checklist of things to look out for and ways to troubleshoot the connection.
service stop sshd && /usr/sbin/sshd -d (restart sshd in debug mode on the remote machine)
ssh -vv <remote-host> (connect to the remote host using ssh in verbose mode)
Before Googling the errors, make sure you can confirm the following:
When you generated the public keys using ssh-keygen you left the passphrase blank.
When you copied the keys over to the remote machine using ssh-copy-id you used the full path to the id_rsa.pub file. If you’re root, it’s quite probable you copied another users ssh keys over instead of your own!
The .ssh directory in the users home directory has 700 permissions and the authorized-keys file has 600 permissions.