1 | <h1>SSH with private/public key authentication</h1> |
---|
2 | |
---|
3 | <p>In this exercise we'll show how you can eliminate passwords by using ssh key |
---|
4 | authentication.</p> |
---|
5 | |
---|
6 | <p>Choose the version of the exercises depending on what OS you are running on |
---|
7 | your laptop.</p> |
---|
8 | |
---|
9 | <p>Remember: the <code>$</code> character before commands indicates that they are to be |
---|
10 | run as your normal login user, not as root.</p> |
---|
11 | |
---|
12 | <h1>For laptops running Windows</h1> |
---|
13 | |
---|
14 | <p>Download the following onto your desktop or into a downloads folder:</p> |
---|
15 | |
---|
16 | <ul> |
---|
17 | <li>putty.exe (you should already have this)</li> |
---|
18 | <li>psftp.exe</li> |
---|
19 | <li>pageant.exe</li> |
---|
20 | <li>puttygen.exe</li> |
---|
21 | </ul> |
---|
22 | |
---|
23 | <p>from <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html</a> |
---|
24 | (Or you can try the installer bundle which gets them all)</p> |
---|
25 | |
---|
26 | <p>Alternately you can use <a href="http://noc.ws.nsrc.org/downloads/">http://noc.ws.nsrc.org/downloads/</a> to download these files if the |
---|
27 | public download site is not available or too slow.</p> |
---|
28 | |
---|
29 | |
---|
30 | <h2>1. Generate an ssh public/private key pair</h2> |
---|
31 | |
---|
32 | <p>Double-click on <code>puttygen.exe</code></p> |
---|
33 | |
---|
34 | <p>At the bottom of the dialog box, under "Parameters":</p> |
---|
35 | |
---|
36 | <ul> |
---|
37 | <li>Make sure the type of key to generate is "SSH-2 RSA"</li> |
---|
38 | <li>Set the number of bits to 2048</li> |
---|
39 | </ul> |
---|
40 | |
---|
41 | <p>Click on "Generate". Move the mouse randomly over the blank area until the |
---|
42 | progress bar reaches 100%</p> |
---|
43 | |
---|
44 | <pre><code>Key comment: [Your Name <your@email.address> ] |
---|
45 | Key passphrase: [chooose a passphrase ] |
---|
46 | Confirm passphrase: [choose same passphrase ] |
---|
47 | </code></pre> |
---|
48 | |
---|
49 | <p>The passphrase is used to keep your private key encrypted on disk. It can be |
---|
50 | pretty much anything you want and as long as you want - including spaces - |
---|
51 | but if you forget it, your key becomes worthless. For now pick something |
---|
52 | that you will easily remember. You can change it at any time you want in |
---|
53 | the future.</p> |
---|
54 | |
---|
55 | <p>Click "Save public key". Give a filename of "id_rsa.pub" (please save |
---|
56 | files into the same directory as where the executables are)</p> |
---|
57 | |
---|
58 | <p>Click "Save private key". Give a filename of "id_rsa.ppk"</p> |
---|
59 | |
---|
60 | <p>Use the mouse to highlight all the text in the box "Public key for pasting |
---|
61 | into OpenSSH authorized_keys file", and copy it to the clipboard.</p> |
---|
62 | |
---|
63 | <p>Exit puttygen.</p> |
---|
64 | |
---|
65 | <p>NOTE: Key generation is a one-off exercise. The more you deploy your public |
---|
66 | key, the more work it to be if you were to lose it and have to start again |
---|
67 | with a new one. I suggest you keep a secure backup of it somewhere, e.g. |
---|
68 | on a CD-ROM or a safe USB key that you lock away.</p> |
---|
69 | |
---|
70 | <h2>2. Copy the PUBLIC key onto your Unix server</h2> |
---|
71 | |
---|
72 | <p>You have two ways of doing this.</p> |
---|
73 | |
---|
74 | <h3>Copy-paste</h3> |
---|
75 | |
---|
76 | <p>Use putty.exe to make a normal ssh connection to your host as the 'sysadm' |
---|
77 | user.</p> |
---|
78 | |
---|
79 | <pre><code>$ cat >>.ssh/authorized_keys |
---|
80 | *** PASTE KEY FROM CLIPBOARD *** |
---|
81 | *** If the cursor is still at the end of the line, hit Enter *** |
---|
82 | *** hit ctrl-D *** |
---|
83 | </code></pre> |
---|
84 | |
---|
85 | <p>The key consists of one very long line, which looks like</p> |
---|
86 | |
---|
87 | <pre><code>ssh-rsa <lots of base64 data> <comment> |
---|
88 | </code></pre> |
---|
89 | |
---|
90 | <p>As a quick check that it hasn't been corrupted, count the lines in the file:</p> |
---|
91 | |
---|
92 | <pre><code>$ wc -l .ssh/authorized_keys |
---|
93 | 1 .ssh/authorized_keys |
---|
94 | </code></pre> |
---|
95 | |
---|
96 | <p>If you don't see "1", then you'll need to fix it (possibly with an editor, |
---|
97 | or else just rm the file and start again)</p> |
---|
98 | |
---|
99 | <p>Now logout.</p> |
---|
100 | |
---|
101 | <h3>Alternative way (if you're having problems with copy-paste)</h3> |
---|
102 | |
---|
103 | <p>Double-click on psftp.exe. Open a connection to your server, and upload |
---|
104 | your public key:</p> |
---|
105 | |
---|
106 | <pre><code>psftp> open pcN.ws.nsrc.org |
---|
107 | login as: sysadm |
---|
108 | sysadm@pcN.ws.nsrc.org's password: <usual one> |
---|
109 | Remote working directory is /home/sysadm |
---|
110 | psftp> put id_rsa.pub |
---|
111 | local:id_rsa.pub => remote:/home/sysadm/id_rsa.pub |
---|
112 | psftp> quit |
---|
113 | </code></pre> |
---|
114 | |
---|
115 | <p>Unfortunately, this public key is not in the format which openssh requires, |
---|
116 | so now login again using putty.exe, and use the following command to convert |
---|
117 | it and put it in the right place.</p> |
---|
118 | |
---|
119 | <pre><code>$ ssh-keygen -i -f id_rsa.pub >>.ssh/authorized_keys |
---|
120 | </code></pre> |
---|
121 | |
---|
122 | <h2>3. Login using your private key</h2> |
---|
123 | |
---|
124 | <p>Start putty.exe again. Enter the hostname as usual, but before clicking |
---|
125 | Open, browse in the left hand column to Connection > SSH > Auth</p> |
---|
126 | |
---|
127 | <pre><code>[-] Connection |
---|
128 | | |
---|
129 | [-] SSH |
---|
130 | | |- Keyex |
---|
131 | | |- Auth <--- CLICK HERE |
---|
132 | </code></pre> |
---|
133 | |
---|
134 | <p>Next to "Private key for authentication", click Browse. Find your |
---|
135 | id_rsa.ppk file, open it, then click Open to start the connection.</p> |
---|
136 | |
---|
137 | <p>You should be prompted for your username as before (sysadm), but then |
---|
138 | instead of being prompted for a password, you are asked for the passphrase |
---|
139 | for your private key. Enter it, and you should be logged in.</p> |
---|
140 | |
---|
141 | <p>This is quite painful (both locating the private key and entering the |
---|
142 | passphrase), so as the final step of the exercise we're going automate it |
---|
143 | using an agent.</p> |
---|
144 | |
---|
145 | <h2>4. Use a passphrase agent</h2> |
---|
146 | |
---|
147 | <p>Run <code>pageant.exe</code></p> |
---|
148 | |
---|
149 | <p>It runs in the background, and adds an icon to your task tray (a PC with |
---|
150 | a black hat at a jaunty angle). You may need to select "Show hidden icons" |
---|
151 | to see it.</p> |
---|
152 | |
---|
153 | <p>Right-click on the icon, and select "Add Key". Browse to your id_rsa.ppk |
---|
154 | and open it. You will be prompted for the passphrase - enter it. (If you |
---|
155 | make a mistake, you'll be prompted again until you get it right)</p> |
---|
156 | |
---|
157 | <p>Now run putty.exe again, enter your hostname, click Open, and enter your |
---|
158 | username (sysadm). You should be logged in immediately, with no prompt for |
---|
159 | either a password or a passphrase!</p> |
---|
160 | |
---|
161 | <p>Try logging in again. Also try using psftp.exe (when it runs, enter |
---|
162 | "open pcN.ws.nsrc.org" to start a connection). No passphrase is needed |
---|
163 | until you tell Pageant to forget the private key.</p> |
---|
164 | |
---|
165 | <h1>For laptops running Linux (or BSD or OSX)</h1> |
---|
166 | |
---|
167 | <h2>1. Generate an ssh public/private key pair</h2> |
---|
168 | |
---|
169 | <pre><code>$ ssh-keygen -t rsa -b 2048 |
---|
170 | Generating public/private rsa key pair. |
---|
171 | Enter file in which to save the key (/home/sysadm/.ssh/id_rsa): <HIT ENTER> |
---|
172 | Created directory '/home/sysadm/.ssh'. |
---|
173 | Enter passphrase (empty for no passphrase): <CHOOSE PASSPHRASE> |
---|
174 | Enter same passphrase again: <SAME PASSPHRASE> |
---|
175 | Your identification has been saved in /home/sysadm/.ssh/id_rsa. |
---|
176 | Your public key has been saved in /home/sysadm/.ssh/id_rsa.pub. |
---|
177 | The key fingerprint is: |
---|
178 | 32:2b:e3:0e:14:fb:60:38:a6:e2:73:95:53:9d:a8:0f sysadm@pcN.ws.nsrc.org |
---|
179 | </code></pre> |
---|
180 | |
---|
181 | <p>The passphrase is used to keep your private key encrypted on disk. It can be |
---|
182 | pretty much anything you want and as long as you want - including spaces - |
---|
183 | but if you forget it, your key becomes worthless. For now pick something |
---|
184 | that you will easily remember. You can change it at any time you want in |
---|
185 | the future (using <code>ssh-keygen -p</code>)</p> |
---|
186 | |
---|
187 | <p>NOTE: Key generation is a one-off exercise. The more you deploy your public |
---|
188 | key, the more work it to be if you were to lose it and have to start again |
---|
189 | with a new one. I suggest you keep a secure backup of it somewhere, e.g. |
---|
190 | on a CD-ROM that you lock away.</p> |
---|
191 | |
---|
192 | <h2>2. Copy the PUBLIC key onto your Unix server</h2> |
---|
193 | |
---|
194 | <p>The simplest way to copy the public key is with scp:</p> |
---|
195 | |
---|
196 | <pre><code>$ scp .ssh/id_rsa.pub sysadm@pcN.ws.nsrc.org:.ssh/authorized_keys |
---|
197 | </code></pre> |
---|
198 | |
---|
199 | <p>Note that .ssh/authorized_keys can contain multiple keys, one per line, |
---|
200 | so on a shared system you might want to append your key instead:</p> |
---|
201 | |
---|
202 | <pre><code>$ cat .ssh/id_rsa.pub | ssh sysadm@pcN.ws.nsrc.org 'cat >>.ssh/authorized_keys' |
---|
203 | </code></pre> |
---|
204 | |
---|
205 | <h2>3. Login using your private key</h2> |
---|
206 | |
---|
207 | <p>Open an ssh connection to your server as normal:</p> |
---|
208 | |
---|
209 | <pre><code>$ ssh sysadm@pcN.ws.nsrc.org |
---|
210 | </code></pre> |
---|
211 | |
---|
212 | <p>This time, instead of being prompted for your password, you should be |
---|
213 | prompted for the passphrase on your private key. Enter it. You should be |
---|
214 | logged in.</p> |
---|
215 | |
---|
216 | <h2>4. Use a passphrase agent</h2> |
---|
217 | |
---|
218 | <p>Entering a passphrase every time you connect would be painful, but this |
---|
219 | isn't necessary if you have an agent which decrypts the private key and |
---|
220 | keeps it in memory.</p> |
---|
221 | |
---|
222 | <p>If you are running under a modern graphical environment like Gnome, you |
---|
223 | probably already got a dialog box prompting you for a passphrase, and this |
---|
224 | means you're already running an agent. You should be able to logout and |
---|
225 | login to the remote server, without being prompted for your passphrase |
---|
226 | again.</p> |
---|
227 | |
---|
228 | <p>To see what identities (decrypted private keys) your agent has in memory:</p> |
---|
229 | |
---|
230 | <pre><code>$ ssh-add -l |
---|
231 | </code></pre> |
---|
232 | |
---|
233 | <p>To forget all identities:</p> |
---|
234 | |
---|
235 | <pre><code>$ ssh-add -d |
---|
236 | </code></pre> |
---|
237 | |
---|
238 | <p>If you don't have an agent, then you can start a new subshell with ssh-agent |
---|
239 | as its parent:</p> |
---|
240 | |
---|
241 | <pre><code>$ ssh-agent bash |
---|
242 | $ ssh-add |
---|
243 | ... prompted for your passphrase |
---|
244 | $ |
---|
245 | </code></pre> |
---|
246 | |
---|
247 | <p>Now the agent will handle future connections for you.</p> |
---|
248 | |
---|
249 | <p>If you are running an older graphical environment, and you normally start |
---|
250 | X using <code>startx</code>, then start it using <code>ssh-agent startx</code> instead. Then type |
---|
251 | 'ssh-add' in an xterm.</p> |
---|
252 | |
---|
253 | <hr /> |
---|
254 | |
---|
255 | <h1>Disable Password Access to your Machine</h1> |
---|
256 | |
---|
257 | <h2>Connect Only With SSH Keys</h2> |
---|
258 | |
---|
259 | <p>Only do this exercise if you have successfully copied your public key to your machine and you |
---|
260 | are being prompted for your ssh private key passphrase when you log in and not your password.</p> |
---|
261 | |
---|
262 | <p>Log in on your machine. Once logged in become the root user:</p> |
---|
263 | |
---|
264 | <pre><code>$ sudo bash</pre></code> |
---|
265 | |
---|
266 | <p>As the root user copy authorized_keys file to the directory /root/.ssh.</p> |
---|
267 | |
---|
268 | <pre><code># mkdir /root/.ssh |
---|
269 | # chmod 700 /root/.ssh |
---|
270 | # cp /home/sysadm/.ssh/authorized_keys /root/.ssh/. |
---|
271 | # chown root:root /root/.ssh/authorized_keys |
---|
272 | # chmod 644 /root/.ssh/authorized_keys |
---|
273 | </pre></code> |
---|
274 | |
---|
275 | <p>Now log out of your machine and try to log back in, but this time as the "root" user, |
---|
276 | not as the "sysadm" user. If you are prompted for your ssh private key passphrase and not a |
---|
277 | password, then you are ready to disable password access to your machine.</p> |
---|
278 | |
---|
279 | <p>Log in on your machine as the root user. Now we are going to edit the file /etc/ssh/sshd_config.</p> |
---|
280 | |
---|
281 | <pre><code># vi /etc/ssh/sshd_config</pre></code> |
---|
282 | |
---|
283 | <p>Insie the file look for the following line:</p> |
---|
284 | |
---|
285 | <code>#PasswordAuthentication yes</code> |
---|
286 | |
---|
287 | <p>Just after this line add a line that says:</p> |
---|
288 | |
---|
289 | <code>PasswordAuthentication no</code> |
---|
290 | |
---|
291 | <p>Save and exit from the file. The reload the ssh server:</p> |
---|
292 | |
---|
293 | <pre><code># service ssh reload</pre></code> |
---|
294 | |
---|
295 | <p>Before logging out we recommend you leave your current session open in case there are problems. You |
---|
296 | could lock yourself out of your machine. If you do let your instructor know. Now use ssh or putty on your laptop |
---|
297 | and try connecting to your server. You should get prompted for your ssh private key's passphrase and |
---|
298 | be able to log in. If you did, everthing is working. At this point all new users on your machine must |
---|
299 | use ssh keys to connect and not passwords. If you wish to verify this you can do the following:</p> |
---|
300 | |
---|
301 | <pre><code># adduser testuser</pre></code> |
---|
302 | |
---|
303 | <p>Answer the on-screen prompts. Once the user has been created and you have given it a new password of |
---|
304 | your choosing, try to open a new ssh session to your machine as that user. You should either be rejected |
---|
305 | or your password attempts will have not affect (depends on the ssh server version).</p> |
---|
306 | |
---|
307 | <p>To log in as this user you would need to copy your public ssh key to their account as we did for |
---|
308 | your sysadm user. This <b>greatly</b> enhances the security of your system. |
---|
309 | |
---|
310 | |
---|
311 | <hr /> |
---|
312 | |
---|
313 | <h1>Additional information [not part of exercises]</h1> |
---|
314 | |
---|
315 | <h2>Agent forwarding</h2> |
---|
316 | |
---|
317 | <p>Using an agent, you can access across multiple ssh hops without having to |
---|
318 | copy your key or enter your passphrase anywhere.</p> |
---|
319 | |
---|
320 | <p>If you enable "agent forwarding" when you login to host X, you can then |
---|
321 | login from X to Y without any prompting (assuming Y has your public key in |
---|
322 | authorized_keys). The request to authenticate is forwarded securely back |
---|
323 | along your original ssh session to the agent running on your workstation.</p> |
---|
324 | |
---|
325 | <p>Under Unix:</p> |
---|
326 | |
---|
327 | <pre><code>$ ssh -o ForwardAgent=yes user@host |
---|
328 | </code></pre> |
---|
329 | |
---|
330 | <p>If you do this frequently, it's easier to configure it in <code>.ssh/hosts</code></p> |
---|
331 | |
---|
332 | <pre><code>host foo |
---|
333 | hostname foo.example.com |
---|
334 | user sysadm |
---|
335 | ForwardAgent yes |
---|
336 | </code></pre> |
---|
337 | |
---|
338 | <p>Then you only have to type <code>ssh foo</code> to get a connection with those options.</p> |
---|
339 | |
---|
340 | <h2>Advanced: X11 forwarding and port forwarding</h2> |
---|
341 | |
---|
342 | <p>ssh can securely carry arbitrary forwarded TCP connections and X11 graphics.</p> |
---|
343 | |
---|
344 | <pre><code>$ ssh -L8080:some.where:80 user@remote.host |
---|
345 | ... while ssh connection is open, a connection to 127.0.0.1 port 8080 |
---|
346 | ... will be tunneled, and the far end will open a connection to |
---|
347 | ... some.where port 80 |
---|
348 | |
---|
349 | $ ssh -X user@remote.host |
---|
350 | ... |
---|
351 | $ xclock # graphical output redirected back through ssh tunnel |
---|
352 | </code></pre> |
---|