328a358c5357068b1ee5ca8872f072e983bf50e6
[platform/upstream/krb5.git] / doc / html / user / tkt_mgmt.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5 <html xmlns="http://www.w3.org/1999/xhtml">
6   <head>
7     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8     
9     <title>Ticket management &mdash; MIT Kerberos Documentation</title>
10     
11     <link rel="stylesheet" href="../_static/agogo.css" type="text/css" />
12     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
13     <link rel="stylesheet" href="../_static/kerb.css" type="text/css" />
14     
15     <script type="text/javascript">
16       var DOCUMENTATION_OPTIONS = {
17         URL_ROOT:    '../',
18         VERSION:     '1.15.2',
19         COLLAPSE_INDEX: false,
20         FILE_SUFFIX: '.html',
21         HAS_SOURCE:  true
22       };
23     </script>
24     <script type="text/javascript" src="../_static/jquery.js"></script>
25     <script type="text/javascript" src="../_static/underscore.js"></script>
26     <script type="text/javascript" src="../_static/doctools.js"></script>
27     <link rel="author" title="About these documents" href="../about.html" />
28     <link rel="copyright" title="Copyright" href="../copyright.html" />
29     <link rel="top" title="MIT Kerberos Documentation" href="../index.html" />
30     <link rel="up" title="For users" href="index.html" />
31     <link rel="next" title="User config files" href="user_config/index.html" />
32     <link rel="prev" title="Password management" href="pwd_mgmt.html" /> 
33   </head>
34   <body>
35     <div class="header-wrapper">
36         <div class="header">
37             
38             
39             <h1><a href="../index.html">MIT Kerberos Documentation</a></h1>
40             
41             <div class="rel">
42                 
43         <a href="../index.html" title="Full Table of Contents"
44             accesskey="C">Contents</a> |
45         <a href="pwd_mgmt.html" title="Password management"
46             accesskey="P">previous</a> |
47         <a href="user_config/index.html" title="User config files"
48             accesskey="N">next</a> |
49         <a href="../genindex.html" title="General Index"
50             accesskey="I">index</a> |
51         <a href="../search.html" title="Enter search criteria"
52             accesskey="S">Search</a> |
53     <a href="mailto:krb5-bugs@mit.edu?subject=Documentation__Ticket management">feedback</a>
54             </div>
55         </div>
56     </div>
57
58     <div class="content-wrapper">
59       <div class="content">
60         <div class="document">
61             
62       <div class="documentwrapper">
63         <div class="bodywrapper">
64           <div class="body">
65             
66   <div class="section" id="ticket-management">
67 <h1>Ticket management<a class="headerlink" href="#ticket-management" title="Permalink to this headline">¶</a></h1>
68 <p>On many systems, Kerberos is built into the login program, and you get
69 tickets automatically when you log in.  Other programs, such as ssh,
70 can forward copies of your tickets to a remote host.  Most of these
71 programs also automatically destroy your tickets when they exit.
72 However, MIT recommends that you explicitly destroy your Kerberos
73 tickets when you are through with them, just to be sure.  One way to
74 help ensure that this happens is to add the <a class="reference internal" href="user_commands/kdestroy.html#kdestroy-1"><em>kdestroy</em></a> command
75 to your .logout file.  Additionally, if you are going to be away from
76 your machine and are concerned about an intruder using your
77 permissions, it is safest to either destroy all copies of your
78 tickets, or use a screensaver that locks the screen.</p>
79 <div class="section" id="kerberos-ticket-properties">
80 <h2>Kerberos ticket properties<a class="headerlink" href="#kerberos-ticket-properties" title="Permalink to this headline">¶</a></h2>
81 <p>There are various properties that Kerberos tickets can have:</p>
82 <p>If a ticket is <strong>forwardable</strong>, then the KDC can issue a new ticket
83 (with a different network address, if necessary) based on the
84 forwardable ticket.  This allows for authentication forwarding without
85 requiring a password to be typed in again.  For example, if a user
86 with a forwardable TGT logs into a remote system, the KDC could issue
87 a new TGT for that user with the network address of the remote system,
88 allowing authentication on that host to work as though the user were
89 logged in locally.</p>
90 <p>When the KDC creates a new ticket based on a forwardable ticket, it
91 sets the <strong>forwarded</strong> flag on that new ticket.  Any tickets that are
92 created based on a ticket with the forwarded flag set will also have
93 their forwarded flags set.</p>
94 <p>A <strong>proxiable</strong> ticket is similar to a forwardable ticket in that it
95 allows a service to take on the identity of the client.  Unlike a
96 forwardable ticket, however, a proxiable ticket is only issued for
97 specific services.  In other words, a ticket-granting ticket cannot be
98 issued based on a ticket that is proxiable but not forwardable.</p>
99 <p>A <strong>proxy</strong> ticket is one that was issued based on a proxiable ticket.</p>
100 <p>A <strong>postdated</strong> ticket is issued with the invalid flag set.  After the
101 starting time listed on the ticket, it can be presented to the KDC to
102 obtain valid tickets.</p>
103 <p>Ticket-granting tickets with the <strong>postdateable</strong> flag set can be used
104 to obtain postdated service tickets.</p>
105 <p><strong>Renewable</strong> tickets can be used to obtain new session keys without
106 the user entering their password again.  A renewable ticket has two
107 expiration times.  The first is the time at which this particular
108 ticket expires.  The second is the latest possible expiration time for
109 any ticket issued based on this renewable ticket.</p>
110 <p>A ticket with the <strong>initial flag</strong> set was issued based on the
111 authentication protocol, and not on a ticket-granting ticket.
112 Application servers that wish to ensure that the user&#8217;s key has been
113 recently presented for verification could specify that this flag must
114 be set to accept the ticket.</p>
115 <p>An <strong>invalid</strong> ticket must be rejected by application servers.
116 Postdated tickets are usually issued with this flag set, and must be
117 validated by the KDC before they can be used.</p>
118 <p>A <strong>preauthenticated</strong> ticket is one that was only issued after the
119 client requesting the ticket had authenticated itself to the KDC.</p>
120 <p>The <strong>hardware authentication</strong> flag is set on a ticket which required
121 the use of hardware for authentication.  The hardware is expected to
122 be possessed only by the client which requested the tickets.</p>
123 <p>If a ticket has the <strong>transit policy</strong> checked flag set, then the KDC
124 that issued this ticket implements the transited-realm check policy
125 and checked the transited-realms list on the ticket.  The
126 transited-realms list contains a list of all intermediate realms
127 between the realm of the KDC that issued the first ticket and that of
128 the one that issued the current ticket.  If this flag is not set, then
129 the application server must check the transited realms itself or else
130 reject the ticket.</p>
131 <p>The <strong>okay as delegate</strong> flag indicates that the server specified in
132 the ticket is suitable as a delegate as determined by the policy of
133 that realm.  Some client applications may use this flag to decide
134 whether to forward tickets to a remote host, although many
135 applications do not honor it.</p>
136 <p>An <strong>anonymous</strong> ticket is one in which the named principal is a
137 generic principal for that realm; it does not actually specify the
138 individual that will be using the ticket.  This ticket is meant only
139 to securely distribute a session key.</p>
140 </div>
141 <div class="section" id="obtaining-tickets-with-kinit">
142 <span id="obtain-tkt"></span><h2>Obtaining tickets with kinit<a class="headerlink" href="#obtaining-tickets-with-kinit" title="Permalink to this headline">¶</a></h2>
143 <p>If your site has integrated Kerberos V5 with the login system, you
144 will get Kerberos tickets automatically when you log in.  Otherwise,
145 you may need to explicitly obtain your Kerberos tickets, using the
146 <a class="reference internal" href="user_commands/kinit.html#kinit-1"><em>kinit</em></a> program.  Similarly, if your Kerberos tickets expire,
147 use the kinit program to obtain new ones.</p>
148 <p>To use the kinit program, simply type <tt class="docutils literal"><span class="pre">kinit</span></tt> and then type your
149 password at the prompt. For example, Jennifer (whose username is
150 <tt class="docutils literal"><span class="pre">jennifer</span></tt>) works for Bleep, Inc. (a fictitious company with the
151 domain name mit.edu and the Kerberos realm ATHENA.MIT.EDU).  She would
152 type:</p>
153 <div class="highlight-python"><div class="highlight"><pre>shell% kinit
154 Password for jennifer@ATHENA.MIT.EDU: &lt;-- [Type jennifer&#39;s password here.]
155 shell%
156 </pre></div>
157 </div>
158 <p>If you type your password incorrectly, kinit will give you the
159 following error message:</p>
160 <div class="highlight-python"><div class="highlight"><pre>shell% kinit
161 Password for jennifer@ATHENA.MIT.EDU: &lt;-- [Type the wrong password here.]
162 kinit: Password incorrect
163 shell%
164 </pre></div>
165 </div>
166 <p>and you won&#8217;t get Kerberos tickets.</p>
167 <p>By default, kinit assumes you want tickets for your own username in
168 your default realm.  Suppose Jennifer&#8217;s friend David is visiting, and
169 he wants to borrow a window to check his mail.  David needs to get
170 tickets for himself in his own realm, EXAMPLE.COM.  He would type:</p>
171 <div class="highlight-python"><div class="highlight"><pre>shell% kinit david@EXAMPLE.COM
172 Password for david@EXAMPLE.COM: &lt;-- [Type david&#39;s password here.]
173 shell%
174 </pre></div>
175 </div>
176 <p>David would then have tickets which he could use to log onto his own
177 machine.  Note that he typed his password locally on Jennifer&#8217;s
178 machine, but it never went over the network.  Kerberos on the local
179 host performed the authentication to the KDC in the other realm.</p>
180 <p>If you want to be able to forward your tickets to another host, you
181 need to request forwardable tickets.  You do this by specifying the
182 <strong>-f</strong> option:</p>
183 <div class="highlight-python"><div class="highlight"><pre>shell% kinit -f
184 Password for jennifer@ATHENA.MIT.EDU: &lt;-- [Type your password here.]
185 shell%
186 </pre></div>
187 </div>
188 <p>Note that kinit does not tell you that it obtained forwardable
189 tickets; you can verify this using the <a class="reference internal" href="user_commands/klist.html#klist-1"><em>klist</em></a> command (see
190 <a class="reference internal" href="#view-tkt"><em>Viewing tickets with klist</em></a>).</p>
191 <p>Normally, your tickets are good for your system&#8217;s default ticket
192 lifetime, which is ten hours on many systems.  You can specify a
193 different ticket lifetime with the <strong>-l</strong> option.  Add the letter
194 <strong>s</strong> to the value for seconds, <strong>m</strong> for minutes, <strong>h</strong> for hours, or
195 <strong>d</strong> for days.  For example, to obtain forwardable tickets for
196 <tt class="docutils literal"><span class="pre">david&#64;EXAMPLE.COM</span></tt> that would be good for three hours, you would
197 type:</p>
198 <div class="highlight-python"><div class="highlight"><pre>shell% kinit -f -l 3h david@EXAMPLE.COM
199 Password for david@EXAMPLE.COM: &lt;-- [Type david&#39;s password here.]
200 shell%
201 </pre></div>
202 </div>
203 <div class="admonition note">
204 <p class="first admonition-title">Note</p>
205 <p class="last">You cannot mix units; specifying a lifetime of 3h30m would
206 result in an error.  Note also that most systems specify a
207 maximum ticket lifetime.  If you request a longer ticket
208 lifetime, it will be automatically truncated to the maximum
209 lifetime.</p>
210 </div>
211 </div>
212 <div class="section" id="viewing-tickets-with-klist">
213 <span id="view-tkt"></span><h2>Viewing tickets with klist<a class="headerlink" href="#viewing-tickets-with-klist" title="Permalink to this headline">¶</a></h2>
214 <p>The <a class="reference internal" href="user_commands/klist.html#klist-1"><em>klist</em></a> command shows your tickets.  When you first obtain
215 tickets, you will have only the ticket-granting ticket.  The listing
216 would look like this:</p>
217 <div class="highlight-python"><div class="highlight"><pre>shell% klist
218 Ticket cache: /tmp/krb5cc_ttypa
219 Default principal: jennifer@ATHENA.MIT.EDU
220
221 Valid starting     Expires            Service principal
222 06/07/04 19:49:21  06/08/04 05:49:19  krbtgt/ATHENA.MIT.EDU@ATHENA.MIT.EDU
223 shell%
224 </pre></div>
225 </div>
226 <p>The ticket cache is the location of your ticket file. In the above
227 example, this file is named <tt class="docutils literal"><span class="pre">/tmp/krb5cc_ttypa</span></tt>. The default
228 principal is your Kerberos principal.</p>
229 <p>The &#8220;valid starting&#8221; and &#8220;expires&#8221; fields describe the period of time
230 during which the ticket is valid.  The &#8220;service principal&#8221; describes
231 each ticket.  The ticket-granting ticket has a first component
232 <tt class="docutils literal"><span class="pre">krbtgt</span></tt>, and a second component which is the realm name.</p>
233 <p>Now, if <tt class="docutils literal"><span class="pre">jennifer</span></tt> connected to the machine <tt class="docutils literal"><span class="pre">daffodil.mit.edu</span></tt>,
234 and then typed &#8220;klist&#8221; again, she would have gotten the following
235 result:</p>
236 <div class="highlight-python"><div class="highlight"><pre>shell% klist
237 Ticket cache: /tmp/krb5cc_ttypa
238 Default principal: jennifer@ATHENA.MIT.EDU
239
240 Valid starting     Expires            Service principal
241 06/07/04 19:49:21  06/08/04 05:49:19  krbtgt/ATHENA.MIT.EDU@ATHENA.MIT.EDU
242 06/07/04 20:22:30  06/08/04 05:49:19  host/daffodil.mit.edu@ATHENA.MIT.EDU
243 shell%
244 </pre></div>
245 </div>
246 <p>Here&#8217;s what happened: when <tt class="docutils literal"><span class="pre">jennifer</span></tt> used ssh to connect to the
247 host <tt class="docutils literal"><span class="pre">daffodil.mit.edu</span></tt>, the ssh program presented her
248 ticket-granting ticket to the KDC and requested a host ticket for the
249 host <tt class="docutils literal"><span class="pre">daffodil.mit.edu</span></tt>.  The KDC sent the host ticket, which ssh
250 then presented to the host <tt class="docutils literal"><span class="pre">daffodil.mit.edu</span></tt>, and she was allowed
251 to log in without typing her password.</p>
252 <p>Suppose your Kerberos tickets allow you to log into a host in another
253 domain, such as <tt class="docutils literal"><span class="pre">trillium.example.com</span></tt>, which is also in another
254 Kerberos realm, <tt class="docutils literal"><span class="pre">EXAMPLE.COM</span></tt>.  If you ssh to this host, you will
255 receive a ticket-granting ticket for the realm <tt class="docutils literal"><span class="pre">EXAMPLE.COM</span></tt>, plus
256 the new host ticket for <tt class="docutils literal"><span class="pre">trillium.example.com</span></tt>.  klist will now
257 show:</p>
258 <div class="highlight-python"><div class="highlight"><pre>shell% klist
259 Ticket cache: /tmp/krb5cc_ttypa
260 Default principal: jennifer@ATHENA.MIT.EDU
261
262 Valid starting     Expires            Service principal
263 06/07/04 19:49:21  06/08/04 05:49:19  krbtgt/ATHENA.MIT.EDU@ATHENA.MIT.EDU
264 06/07/04 20:22:30  06/08/04 05:49:19  host/daffodil.mit.edu@ATHENA.MIT.EDU
265 06/07/04 20:24:18  06/08/04 05:49:19  krbtgt/EXAMPLE.COM@ATHENA.MIT.EDU
266 06/07/04 20:24:18  06/08/04 05:49:19  host/trillium.example.com@EXAMPLE.COM
267 shell%
268 </pre></div>
269 </div>
270 <p>Depending on your host&#8217;s and realm&#8217;s configuration, you may also see a
271 ticket with the service principal <tt class="docutils literal"><span class="pre">host/trillium.example.com&#64;</span></tt>.  If
272 so, this means that your host did not know what realm
273 trillium.example.com is in, so it asked the <tt class="docutils literal"><span class="pre">ATHENA.MIT.EDU</span></tt> KDC for
274 a referral.  The next time you connect to <tt class="docutils literal"><span class="pre">trillium.example.com</span></tt>,
275 the odd-looking entry will be used to avoid needing to ask for a
276 referral again.</p>
277 <p>You can use the <strong>-f</strong> option to view the flags that apply to your
278 tickets.  The flags are:</p>
279 <table border="1" class="docutils">
280 <colgroup>
281 <col width="17%" />
282 <col width="83%" />
283 </colgroup>
284 <tbody valign="top">
285 <tr class="row-odd"><td>F</td>
286 <td>Forwardable</td>
287 </tr>
288 <tr class="row-even"><td>f</td>
289 <td>forwarded</td>
290 </tr>
291 <tr class="row-odd"><td>P</td>
292 <td>Proxiable</td>
293 </tr>
294 <tr class="row-even"><td>p</td>
295 <td>proxy</td>
296 </tr>
297 <tr class="row-odd"><td>D</td>
298 <td>postDateable</td>
299 </tr>
300 <tr class="row-even"><td>d</td>
301 <td>postdated</td>
302 </tr>
303 <tr class="row-odd"><td>R</td>
304 <td>Renewable</td>
305 </tr>
306 <tr class="row-even"><td>I</td>
307 <td>Initial</td>
308 </tr>
309 <tr class="row-odd"><td>i</td>
310 <td>invalid</td>
311 </tr>
312 <tr class="row-even"><td>H</td>
313 <td>Hardware authenticated</td>
314 </tr>
315 <tr class="row-odd"><td>A</td>
316 <td>preAuthenticated</td>
317 </tr>
318 <tr class="row-even"><td>T</td>
319 <td>Transit policy checked</td>
320 </tr>
321 <tr class="row-odd"><td>O</td>
322 <td>Okay as delegate</td>
323 </tr>
324 <tr class="row-even"><td>a</td>
325 <td>anonymous</td>
326 </tr>
327 </tbody>
328 </table>
329 <p>Here is a sample listing.  In this example, the user <em>jennifer</em>
330 obtained her initial tickets (<strong>I</strong>), which are forwardable (<strong>F</strong>)
331 and postdated (<strong>d</strong>) but not yet validated (<strong>i</strong>):</p>
332 <div class="highlight-python"><div class="highlight"><pre>shell% klist -f
333 Ticket cache: /tmp/krb5cc_320
334 Default principal: jennifer@ATHENA.MIT.EDU
335
336 Valid starting      Expires             Service principal
337 31/07/05 19:06:25  31/07/05 19:16:25  krbtgt/ATHENA.MIT.EDU@ATHENA.MIT.EDU
338         Flags: FdiI
339 shell%
340 </pre></div>
341 </div>
342 <p>In the following example, the user <em>david</em>&#8216;s tickets were forwarded
343 (<strong>f</strong>) to this host from another host.  The tickets are reforwardable
344 (<strong>F</strong>):</p>
345 <div class="highlight-python"><div class="highlight"><pre>shell% klist -f
346 Ticket cache: /tmp/krb5cc_p11795
347 Default principal: david@EXAMPLE.COM
348
349 Valid starting     Expires            Service principal
350 07/31/05 11:52:29  07/31/05 21:11:23  krbtgt/EXAMPLE.COM@EXAMPLE.COM
351         Flags: Ff
352 07/31/05 12:03:48  07/31/05 21:11:23  host/trillium.example.com@EXAMPLE.COM
353         Flags: Ff
354 shell%
355 </pre></div>
356 </div>
357 </div>
358 <div class="section" id="destroying-tickets-with-kdestroy">
359 <h2>Destroying tickets with kdestroy<a class="headerlink" href="#destroying-tickets-with-kdestroy" title="Permalink to this headline">¶</a></h2>
360 <p>Your Kerberos tickets are proof that you are indeed yourself, and
361 tickets could be stolen if someone gains access to a computer where
362 they are stored.  If this happens, the person who has them can
363 masquerade as you until they expire.  For this reason, you should
364 destroy your Kerberos tickets when you are away from your computer.</p>
365 <p>Destroying your tickets is easy.  Simply type kdestroy:</p>
366 <div class="highlight-python"><div class="highlight"><pre>shell% kdestroy
367 shell%
368 </pre></div>
369 </div>
370 <p>If <a class="reference internal" href="user_commands/kdestroy.html#kdestroy-1"><em>kdestroy</em></a> fails to destroy your tickets, it will beep and
371 give an error message.  For example, if kdestroy can&#8217;t find any
372 tickets to destroy, it will give the following message:</p>
373 <div class="highlight-python"><div class="highlight"><pre>shell% kdestroy
374 kdestroy: No credentials cache file found while destroying cache
375 shell%
376 </pre></div>
377 </div>
378 </div>
379 </div>
380
381
382           </div>
383         </div>
384       </div>
385         </div>
386         <div class="sidebar">
387     <h2>On this page</h2>
388     <ul>
389 <li><a class="reference internal" href="#">Ticket management</a><ul>
390 <li><a class="reference internal" href="#kerberos-ticket-properties">Kerberos ticket properties</a></li>
391 <li><a class="reference internal" href="#obtaining-tickets-with-kinit">Obtaining tickets with kinit</a></li>
392 <li><a class="reference internal" href="#viewing-tickets-with-klist">Viewing tickets with klist</a></li>
393 <li><a class="reference internal" href="#destroying-tickets-with-kdestroy">Destroying tickets with kdestroy</a></li>
394 </ul>
395 </li>
396 </ul>
397
398     <br/>
399     <h2>Table of contents</h2>
400     <ul class="current">
401 <li class="toctree-l1 current"><a class="reference internal" href="index.html">For users</a><ul class="current">
402 <li class="toctree-l2"><a class="reference internal" href="pwd_mgmt.html">Password management</a></li>
403 <li class="toctree-l2 current"><a class="current reference internal" href="">Ticket management</a><ul class="simple">
404 </ul>
405 </li>
406 <li class="toctree-l2"><a class="reference internal" href="user_config/index.html">User config files</a></li>
407 <li class="toctree-l2"><a class="reference internal" href="user_commands/index.html">User commands</a></li>
408 </ul>
409 </li>
410 <li class="toctree-l1"><a class="reference internal" href="../admin/index.html">For administrators</a></li>
411 <li class="toctree-l1"><a class="reference internal" href="../appdev/index.html">For application developers</a></li>
412 <li class="toctree-l1"><a class="reference internal" href="../plugindev/index.html">For plugin module developers</a></li>
413 <li class="toctree-l1"><a class="reference internal" href="../build/index.html">Building Kerberos V5</a></li>
414 <li class="toctree-l1"><a class="reference internal" href="../basic/index.html">Kerberos V5 concepts</a></li>
415 <li class="toctree-l1"><a class="reference internal" href="../formats/index.html">Protocols and file formats</a></li>
416 <li class="toctree-l1"><a class="reference internal" href="../mitK5features.html">MIT Kerberos features</a></li>
417 <li class="toctree-l1"><a class="reference internal" href="../build_this.html">How to build this documentation from the source</a></li>
418 <li class="toctree-l1"><a class="reference internal" href="../about.html">Contributing to the MIT Kerberos Documentation</a></li>
419 <li class="toctree-l1"><a class="reference internal" href="../resources.html">Resources</a></li>
420 </ul>
421
422     <br/>
423     <h4><a href="../index.html">Full Table of Contents</a></h4>
424     <h4>Search</h4>
425     <form class="search" action="../search.html" method="get">
426       <input type="text" name="q" size="18" />
427       <input type="submit" value="Go" />
428       <input type="hidden" name="check_keywords" value="yes" />
429       <input type="hidden" name="area" value="default" />
430     </form>
431         </div>
432         <div class="clearer"></div>
433       </div>
434     </div>
435
436     <div class="footer-wrapper">
437         <div class="footer" >
438             <div class="right" ><i>Release: 1.15.2</i><br />
439                 &copy; <a href="../copyright.html">Copyright</a> 1985-2017, MIT.
440             </div>
441             <div class="left">
442                 
443         <a href="../index.html" title="Full Table of Contents"
444             >Contents</a> |
445         <a href="pwd_mgmt.html" title="Password management"
446             >previous</a> |
447         <a href="user_config/index.html" title="User config files"
448             >next</a> |
449         <a href="../genindex.html" title="General Index"
450             >index</a> |
451         <a href="../search.html" title="Enter search criteria"
452             >Search</a> |
453     <a href="mailto:krb5-bugs@mit.edu?subject=Documentation__Ticket management">feedback</a>
454             </div>
455         </div>
456     </div>
457
458   </body>
459 </html>