| 
									
										
										
										
											2016-02-04 15:42:49 +01:00
										 |  |  | # This module defines a systemd service that sets the SSH host key and | 
					
						
							|  |  |  | # authorized client key and host name of virtual machines running on | 
					
						
							|  |  |  | # Amazon EC2, Eucalyptus and OpenStack Compute (Nova). | 
					
						
							| 
									
										
										
										
											2011-04-06 15:09:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | { config, lib, pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2011-04-06 15:09:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | with lib; | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   config = { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-04 15:42:49 +01:00
										 |  |  |     systemd.services.apply-ec2-data = | 
					
						
							|  |  |  |       { description = "Apply EC2 Data"; | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-30 17:55:30 +02:00
										 |  |  |         wantedBy = [ "multi-user.target" "sshd.service" ]; | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  |         before = [ "sshd.service" ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-04 15:42:49 +01:00
										 |  |  |         path = [ pkgs.iproute ]; | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         script = | 
					
						
							|  |  |  |           ''
 | 
					
						
							|  |  |  |             ${optionalString (config.networking.hostName == "") ''
 | 
					
						
							| 
									
										
										
										
											2015-05-04 16:56:46 +02:00
										 |  |  |               echo "setting host name..." | 
					
						
							| 
									
										
										
										
											2016-02-04 15:42:49 +01:00
										 |  |  |               if [ -s /etc/ec2-metadata/hostname ]; then | 
					
						
							|  |  |  |                   ${pkgs.nettools}/bin/hostname $(cat /etc/ec2-metadata/hostname) | 
					
						
							|  |  |  |               fi | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  |             ''}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ! [ -e /root/.ssh/authorized_keys ]; then | 
					
						
							|  |  |  |                 echo "obtaining SSH key..." | 
					
						
							| 
									
										
										
										
											2015-01-15 18:36:38 +01:00
										 |  |  |                 mkdir -m 0700 -p /root/.ssh | 
					
						
							| 
									
										
										
										
											2016-02-04 15:42:49 +01:00
										 |  |  |                 if [ -s /etc/ec2-metadata/public-keys-0-openssh-key ]; then | 
					
						
							|  |  |  |                     cat /etc/ec2-metadata/public-keys-0-openssh-key >> /root/.ssh/authorized_keys | 
					
						
							| 
									
										
										
										
											2015-09-28 13:31:28 +02:00
										 |  |  |                     echo "new key added to authorized_keys" | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  |                     chmod 600 /root/.ssh/authorized_keys | 
					
						
							|  |  |  |                 fi | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # Extract the intended SSH host key for this machine from | 
					
						
							|  |  |  |             # the supplied user data, if available.  Otherwise sshd will | 
					
						
							|  |  |  |             # generate one normally. | 
					
						
							| 
									
										
										
										
											2016-02-04 15:42:49 +01:00
										 |  |  |             userData=/etc/ec2-metadata/user-data | 
					
						
							| 
									
										
										
										
											2015-09-23 00:03:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             mkdir -m 0755 -p /etc/ssh | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-19 11:49:31 -06:00
										 |  |  |             if [ -s "$userData" ]; then | 
					
						
							|  |  |  |               key="$(sed 's/|/\n/g; s/SSH_HOST_DSA_KEY://; t; d' $userData)" | 
					
						
							|  |  |  |               key_pub="$(sed 's/SSH_HOST_DSA_KEY_PUB://; t; d' $userData)" | 
					
						
							|  |  |  |               if [ -n "$key" -a -n "$key_pub" -a ! -e /etc/ssh/ssh_host_dsa_key ]; then | 
					
						
							|  |  |  |                   (umask 077; echo "$key" > /etc/ssh/ssh_host_dsa_key) | 
					
						
							|  |  |  |                   echo "$key_pub" > /etc/ssh/ssh_host_dsa_key.pub | 
					
						
							|  |  |  |               fi | 
					
						
							| 
									
										
										
										
											2015-09-23 00:03:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-19 11:49:31 -06:00
										 |  |  |               key="$(sed 's/|/\n/g; s/SSH_HOST_ED25519_KEY://; t; d' $userData)" | 
					
						
							|  |  |  |               key_pub="$(sed 's/SSH_HOST_ED25519_KEY_PUB://; t; d' $userData)" | 
					
						
							|  |  |  |               if [ -n "$key" -a -n "$key_pub" -a ! -e /etc/ssh/ssh_host_ed25519_key ]; then | 
					
						
							|  |  |  |                   (umask 077; echo "$key" > /etc/ssh/ssh_host_ed25519_key) | 
					
						
							|  |  |  |                   echo "$key_pub" > /etc/ssh/ssh_host_ed25519_key.pub | 
					
						
							|  |  |  |               fi | 
					
						
							| 
									
										
										
										
											2015-09-23 00:03:13 +02:00
										 |  |  |             fi | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  |           '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         serviceConfig.Type = "oneshot"; | 
					
						
							|  |  |  |         serviceConfig.RemainAfterExit = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services."print-host-key" = | 
					
						
							|  |  |  |       { description = "Print SSH Host Key"; | 
					
						
							|  |  |  |         wantedBy = [ "multi-user.target" ]; | 
					
						
							|  |  |  |         after = [ "sshd.service" ]; | 
					
						
							|  |  |  |         script = | 
					
						
							|  |  |  |           ''
 | 
					
						
							|  |  |  |             # Print the host public key on the console so that the user | 
					
						
							|  |  |  |             # can obtain it securely by parsing the output of | 
					
						
							|  |  |  |             # ec2-get-console-output. | 
					
						
							|  |  |  |             echo "-----BEGIN SSH HOST KEY FINGERPRINTS-----" > /dev/console | 
					
						
							| 
									
										
										
										
											2015-09-24 10:36:50 +02:00
										 |  |  |             for i in /etc/ssh/ssh_host_*_key.pub; do | 
					
						
							|  |  |  |                 ${config.programs.ssh.package}/bin/ssh-keygen -l -f $i > /dev/console | 
					
						
							|  |  |  |             done | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  |             echo "-----END SSH HOST KEY FINGERPRINTS-----" > /dev/console | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |         serviceConfig.Type = "oneshot"; | 
					
						
							|  |  |  |         serviceConfig.RemainAfterExit = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2011-04-06 15:09:34 +00:00
										 |  |  | } |