(no commit message)
[devwiki.git] / ConfiguringRHEL.mdwn
1 First we need to install and configure moonshot, its dependencies, and a local RADIUS server for testing<br />
2 In a real deployment, a local RADIUS server is not needed, however it simplifies testing if one is available<br />
3 __gss-server__ and __gss-client__ are standard Kerberos diagnostic tools, which give us a lot of information that is helpful for debugging<br />
4 Again, in a real deployment these are not required, but help with testing
5
6 This guide walks through deploying the client, IdP and SP portions of moonshot - depending on your target, some steps may be inappropriate.
7
8 ## Environment
9 ### LD_LIBRARY_PATH
10 __LD_LIBRARY_PATH__ has to have _/opt/moonshot/lib64/_ and _/usr/lib64/freeradius_ added to it.<br />
11 The best way to do this is create a file at _/etc/profile.d/moonshot.sh_, with the following:
12
13     if \[[ $LD_LIBRARY_PATH != */opt/moonshot/lib64/:/usr/lib64/freeradius/* ]]
14     then
15         export LD_LIBRARY_PATH=/opt/moonshot/lib64/:/usr/lib64/freeradius/:$LD_LIBRARY_PATH
16     fi
17
18 After, either restart your shell session, or:
19
20     source /etc/profile.d/moonshot.sh
21
22 This is required as moonshot currently stores its modified libraries separately to the main system ones to avoid conflicts.  This should not be necessary in the future.
23
24
25 ### SELinux set to permissive
26 Moonshot has a couple of outstanding issues regarding proper labeling of _SELinux_ contexts, causing it to fail when _SELinux_ is enforcing.  This should be resolved soon - change the setting in _/etc/sysconfig/selinux_, or in _/etc/rc.local_:
27
28     echo 0 > /selinux/enforce
29
30 ### EPEL
31 Moonshot needs __EPEL__ for a few extra libraries (as pulling them from a semi-supported repository is preferable to repackaging).<br />
32 The simplest way to install EPEL is:
33
34     yum install epel-release
35
36 ## Moonshot Packages
37 The RPM's and SRPM's for moonshot are currently hosted at [http://yum.dev.ja.net] - this may change (and in fact, is quite likely to change) in the future.  The packages are currently unsigned.  
38
39
40
41 First we need to install and configure moonshot, its dependencies, and a local RADIUS server for testing
42 In a real deployment, a local RADIUS server is not needed, however it simplifies testing if one is available
43 __gss-server__ and __gss-client__ are standard Kerberos diagnostic tools, which give us a lot of information that is helpful for debugging
44 Again, in a real deployment these are not required, but help with testing
45
46 This guide walks through deploying the client, IdP and SP portions of moonshot - depending on your target, some steps may be inappropriate.
47
48 ## Environment
49 ### LD_LIBRARY_PATH
50 __LD_LIBRARY_PATH__ has to have _/opt/moonshot/lib64/_ and _/usr/lib64/freeradius_ added to it.<br />
51 The best way to do this is create a file at _/etc/profile.d/moonshot.sh_, with the following:
52
53     if [ [ $LD_LIBRARY_PATH != */opt/moonshot/lib64/:/usr/lib64/freeradius/* ] ]
54     then
55         export LD_LIBRARY_PATH=/opt/moonshot/lib64/:/usr/lib64/freeradius/:$LD_LIBRARY_PATH
56     fi
57
58 This is required as moonshot currently stores its modified libraries separately to the main system ones to avoid conflicts.  This should not be necessary in the future.
59
60
61 ### SELinux set to permissive
62 Moonshot has a couple of outstanding issues regarding proper labeling of _SELinux_ contexts, causing it to fail when _SELinux_ is enforcing.  This should be resolved soon - change the setting in _/etc/sysconfig/selinux_, or in _/etc/rc.local_:
63
64     echo 0 > /selinux/enforce
65
66 ### EPEL
67 Moonshot needs __EPEL__ for a few extra libraries (as pulling them from a semi-supported repository is preferable to repackaging).<br />
68 The simplest way to install EPEL is:
69
70     rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
71     yum install epel-release
72
73 ## Moonshot Packages
74 The RPM's and SRPM's for moonshot are currently hosted at [[http://yum.dev.ja.net]] - this may change (and in fact, is quite likely to change) in the future.  The packages are currently unsigned.<br />
75 Example _/etc/yum.repos.d/moonshot.repo_
76
77     [Moonshot]
78     name=Moonshot
79     baseurl=http://yum.dev.ja.net/RPMS/x86_64/
80     gpgcheck=0
81
82 After setting up the repository definition, we'll set up a composite ORPS/IdP.
83
84 ##Moonshot IdP
85 To install the diagnostic tools (only needed for testing) and the RADIUSd:
86
87     yum install freeradius krb5-moonshot-devel moonshot-gss-eap
88
89
90 Once FreeRADIUS is installed, a source of identity needs to be enabled - either the roaming network in the case of an ORPS, or AD/LDAP/etc for an IdP.  For now, we'll just use a flat file.  Open _/etc/raddb/users_ and locate the following fragment:
91
92
93     # This is a complete entry for "steve". Note that there is no Fall-Through
94     # entry so that no DEFAULT entry will be used, and the user will NOT
95     # get any attributes in addition to the ones listed here.
96     #
97     #   steve   Cleartext-Password := "testing"
98     #   Service-Type = Framed-User,
99     #   Framed-Protocol = PPP,
100
101 Uncomment the line beginning __steve__.
102
103 __Chargeable-User-Identity__ is the value used to decide what user account to log in the user as on the SSH server.<br />
104 This value would normally be set by your local RADIUS proxy (ORPS) – so in a real deployment, rather than statically logging the user in as __moonshot__ you may decide to use something like __steve-camford.ac.uk__.<br />
105 If anonymity is required, you could use a Perl or Python script to generate something like __user-789-camford.ac.uk__.<br />
106 The exact value does not matter – only that the mappings are consistent, so that the user gets access to the same local account each time.
107 To allow creation of accounts on demand you could use __LDAP__ – when the ORPS sees a successful authentication, it could trigger a script that creates the desired account in an __LDAP__ domain.
108 It is not guaranteed that __Chargeable-User-Identity__ will be used permanently – in the future a specific RADIUS attribute may be created instead.
109
110 To activate CUI insertion, Edit _/etc/raddb/sites-enabled/default_, and find the post-auth section, and add the following:
111
112     update reply {
113         Chargeable-User-Identity = "moonshot"
114     }
115
116 Note in the case of an ORPS you need to unfilter this attribute in _/etc/raddb/attrs_ to prevent this attribute from being stripped on roaming requests.
117
118 A legacy attribute required for SSH at this time is the user name returned by the IdP.  To make this happen, Edit _/etc/raddb/sites-enabled/inner-tunnel_, find the following and uncomment it:
119
120                 #update outer.reply {
121                 #       User-Name = "%{request:User-Name}"
122                 #}
123
124 Finally, set the EAP type in use by moonshot (EAP-TTLS) by editing _/etc/raddb/eap.conf_ 
125
126     default_eap_type = md5
127  
128 FreeRADIUS now has a very minimal IdP/ORPS configuration, and can be started with:
129
130     service radiusd restart
131
132
133 If you encounter any issues, you can run radius in debug mode to see what is going on internally.
134
135     service radiusd stop
136     radiusd -X
137
138 When in debug mode, FreeRADIUS acts as an interactive program, so it should be run on a separate console, or under GNU Screen.
139
140 ##Moonshot Proper
141 First we need a minimal _/etc/radsec.conf_
142
143     dictionary = "/etc/raddb/dictionary"
144     
145     realm gss-eap {
146         type = "UDP"
147         timeout = 5
148         retries = 3
149         server {
150             hostname = "127.0.0.1"
151             service = "1812"
152             secret = "testing123"
153         }
154     }
155
156 This tells the moonshot SP where to find a RADIUS server for authentication - in this case, we will use the local server just configured.<br />
157 Moonshot will ultimately use RADSEC for communicating with the radius server – in which case you would use __transport="TCP"__ in _/etc/radsc.conf_<br />
158 Ultimately, the final values depend on the deployment – probably the address, port and secret used by your ORPS.
159
160 ###gss_eap_id
161
162 Next, a file is created in the home directory at _~/.gss_eap_id_ – this is the file that moonshot looks in for credentials.
163 The format is very simple – username followed by a password.  For now, set it to:
164     steve
165     testing
166
167 In a deployment with a GUI, this file is replaced by the Moonshot Identity Selector.  It is conceivable in the future that the Identity Selector GUI will be supplemented with a curses-like UI, or other mechanism allowing console usage.
168
169 ###Shibboleth
170
171 Moonshot uses _libshib_ to parse RADIUS and SAML attributes – SAML assertions can be embedded inside RADIUS responses by the IdP, allowing an ORPS to exercise a very fine-grained authorization policy.
172 In the demo we just use a very simple example – mapping the _Chargeable-User-Identity_ to a local user account, but in a real deployment you could map a SAML attribute to the user account just as easily.
173
174 Delete _/etc/shibboleth/attribute-map.xml_ and replace it with:
175
176     <Attributes xmlns="urn:mace:shibboleth:2.0:attribute-map" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
177         <GSSAPIAttribute name="urn:ietf:params:gss-eap:radius-avp urn:x-radius:89" id="local-login-user"/>
178     </Attributes>
179
180 In this case, 89 corresponds to _Chargeable-User-Identity_, which is mapped to _local-login-user_, which sets the local account that the user will be given access to.
181
182 To load the moonshot extensions, under the root node in _/etc/shibboleth/shibboleth2.xml_, add:
183     <Extensions>
184         <Library path="plugins.so" fatal="true"/>
185     </Extensions>
186
187 Further down the same file, find this line:
188
189     <AttributeExtractor type="XML" validate="true" path="attribute-map.xml"/>
190
191 Directly underneath it, add:
192
193     <AttributeExtractor type="GSSAPI" validate="true" path="attribute-map.xml"/>
194
195 Note that this file is sensitive to the order of statements.
196
197 ###/etc/gss/mech
198
199 This file tells moonshot what encryption options are valid for use with GSS.
200
201     #
202     # Sample mechanism glue configuration for EAP GSS mechanism.
203     #
204     # Any encryption type supported by Kerberos can be defined as the
205     # last element of the OID arc.
206     #
207     eap-aes128          1.3.6.1.4.1.5322.22.1.17        mech_eap.so
208     eap-aes256          1.3.6.1.4.1.5322.22.1.18        mech_eap.so
209
210 ##Testing Functionality
211
212 As mentioned earlier, we will be using the Kerberos test tools to make sure that things are working.<br />
213 To start the _gss-server_, run:
214     /opt/moonshot/sbin/gss-server host@localhost &
215
216 There are two ways to start _gss-client_ – the first specifies an encryption method to use by its OID 1.3.6.1.4.1.5322.22.1.18 (as seen in /etc/gss/mech):
217     /opt/moonshot/bin/gss-client -mech "{1 3 6 1 4 1 5322 22 1 18}" 127.0.0.1 host@localhost bar
218
219
220 The second uses __Simple and Protected GSSAPI Negotiation Mechanism (SPNEGO)__<br />
221 This chooses the "best" mutually-agreeable encryption method for between client and server.  To invoke the client using __SPNEGO__, use:
222     /opt/moonshot/bin/gss-client -spnego 127.0.0.1 host@localhost bar
223
224 ##Sample Output
225
226     Attribute local-login-user Authenticated Complete
227     
228     moonshot
229     
230     6d6f6f6e73686f74
231     
232     UID: 501
233     Accepted connection: "steve"
234     Sending init_sec_context token (size=150)...continue needed...
235     
236     context flag: GSS_C_MUTUAL_FLAG
237     context flag: GSS_C_REPLAY_FLAG
238     context flag: GSS_C_SEQUENCE_FLAG
239     context flag: GSS_C_CONF_FLAG 
240     context flag: GSS_C_INTEG_FLAG 
241     "steve" to "host/moonbuildcentos.dev.ja.net", lifetime -1, flags 13e, locally initiated, open
242     Name type of source name is { 1 2 840 113554 1 2 1 1 }.
243     Mechanism { 1 3 6 1 5 5 2 } supports 4 names
244       0: { 1 2 840 113554 1 2 1 1 }
245       1: { 1 2 840 113554 1 2 1 2 }
246       2: { 1 2 840 113554 1 2 1 3 }
247       3: { 1 2 840 113554 1 2 1 4 }
248     Received message: "testing"
249     Signature verified.
250     NOOP token
251
252 Running _gss-client_ produces a massive amount of output.<br />
253 The important part is at the end – you should see output similar to what is on the previous slide.<br />
254 If you do not see the line:
255     Attribute local-login-user Authenticated Complete
256 Then attribute mapping is not functioning properly, and you need to check your shibboleth configuration.
257
258 ##SSH
259 To install moonshot-enabled SSH:
260
261     yum install openssh-moonshot-clients openssh-moonshot-server
262
263
264 Inside _/etc/ssh/sshd\_config_, and if these values are not set already:<br />
265 Uncomment __UsePrivilegeSeparation__ and set it to __‘no’__
266
267         UsePriviligeSeparation no
268
269 Uncomment __GSSAPIAuthentication__ and set it to __‘yes’__
270
271         GSSAPIAuthentication yes
272
273 Uncomment __GSSAPIKeyExchange__ and set it to __‘yes’__
274
275         GSSAPIKeyExchange yes
276
277 Inside _/etc/ssh/ssh\_config_ and if these values are not set already:<br />
278 Uncomment __GSSAPIAuthentication__ and set it to __‘yes’__
279
280         GSSAPIAuthentication yes
281
282 Uncomment __GSSAPIKeyExchange__ and set it to __‘yes’__
283
284         GSSAPIKeyExchange yes
285
286 ###Running SSH
287
288 Finally, we need to start sshd on a seperate port:
289
290     /opt/moonshot/sbin/sshd –p 2222
291
292 At this time we do not recommend running __openssh-moonshot__ as the systemwide SSH client or server – it should be installed alongside the the standard SSH client and server.<br />
293 Also note, that sshd must be invoked with its full path, i.e. _/opt/moonshot/sbin/sshd._
294
295 Finally, try connecting with the following:
296
297     /opt/moonshot/bin/ssh –p 2222 –l "" 127.0.0.1
298
299 With any luck, magic happens and you are logged in as the user specified in your _Chargeable-User-Identity_!<br />
300 After successfully logging in, don’t forget to type __exit__ to end the SSH session and return to the root shell.<br />
301 Note in the SSH client command, the option __-l ""__ – this signifies that no username is to be sent to the SSH server. 
302
303 ##Remote IdP
304 This is left for an exercise for the user - at this stage it should just be a case of changing _/etc/radsec.conf_ to point at the right RADIUSd