Friday, July 20, 2012

Integrating FreeIPA and Alfresco...

After describing how to install CentOS, DNS and reverse DNS, FreeIPA and Alfresco, in this post I'm going to describe how to integrate Alfresco with FreeIPA. I want to achieve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following goals with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 integration:
  • Users and groups are kept within FreeIPA and aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication is done by FreeIPA.
  • Alfresco Web interface honors Kerberos tickets. Upon opening Web interface users are immediately presented with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir pages withoug necessity for aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication (if, of course, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have valid Kerberos tickets).
  • Aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication when mounting DAV share is also done via Kerberos tickets.
In short, I want to achieve SSO (Single Sign-On) as much as possible. Users sign in when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y start to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir workstations once, that's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have to enter password.


Preparation step


In case you don't have any users in FreeIPA it is a good idea to create at least one so that you can test integration process.

Also, alfresco host has to join Kerberos domain. This is done using ipa-client-install tool from ipa-client package. So, install ipa-client using yum and run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tool. This is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 transcript for my case:
# ipa-client-install
DNS domain 'example-domain.com' is not configured for automatic KDC address lookup.
KDC address will be set to fixed value.

Discovery was successful!
Hostname: alfresco.example-domain.local
Realm: EXAMPLE-DOMAIN.COM
DNS Domain: example-domain.local
IPA Server: ipa.example-domain.local
BaseDN: dc=example-domain,dc=com


Continue to configure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se values? [no]: yes
User authorized to enroll computers: admin
Synchronizing time with KDC...
Password for admin@EXAMPLE-DOMAIN.COM:

Enrolled in IPA realm EXAMPLE-DOMAIN.COM
Created /etc/ipa/default.conf
Configured /etc/sssd/sssd.conf
Configured /etc/krb5.conf for IPA realm EXAMPLE-DOMAIN.COM
SSSD enabled
NTP enabled
Client configuration complete.
As you can see, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tool automatically figured out all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parameters using DNS. In case you DNS isn't configured you'll have to provide all this information manually.

Integrating with LDAP


First, we are going to connect Alfresco to LDAP. Basically, LDAP will be used for storing user data.

Go to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 directory $WEBAPPS/alfresco/WEB-INF/classes/alfresco/subsystems/Aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication/ldap. Open file ldap-aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.properties in text editor and change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following lines:
  • ldap.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.active should be set to false, i.e. we are not using LDAP for aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication!
  • Set ldap.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.userNameFormat to uid=%s,cn=users,cn=accounts,dc=example-domain,dc=com
  • ldap.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.java.naming.provider.url should be set to point to your FreeIPA instance. In our case that should be ldap://ipa.example-domain.local:389
  • Set default principal for user and group synchronization to Directory Manager, i.e. set ldap.synchronization.java.naming.security.principal should be set to cn\=Directory\ Manager (note backslashes!).
  • Define password of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user for synchronization, i.e. set value of ldap.synchronization.java.naming.security.credentials to whatever password you defined for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user.
  • Change base DN of users, i.e. set ldap.synchronization.userSearchBase to cn\=users,cn\=accounts,dc\=example-domain,dc\=com. Again, note backslashes.
  • Change base DN of groups, i.e. set ldap.synchronization.groupSearchBase to cn\=groups,cn\=accounts,dc\=example-domain,dc\=com
Two things to note. The first one is security related! Namely you should not (ab)use Directory Manager to connect to directory server in production environment, i.e. you should create a separate user for that role. Next thing to note is that base DN in LDAP mirrors Kerberos domain, i.e. EXAMPLE-DOMAIN.COM and not DNS domain (example-domain.local).

Now, open file $WEBAPPS/ alfresco/WEB-INF/classes/alfresco-global.properties and find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following line:
#aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.chain=alfrescoNtlm1:alfrescoNtlm
it is commented out, and shown is default value (i.e. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value that will be assumed if variable isn't defined). So, remove comment mark (hash) and modify line to read like this:
aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.chain=alfrescoNtlm1:alfrescoNtlm,ldap1:ldap
What you are basically saying is that first local aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication should be tried and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n LDAP. Later we will add kerberos for aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.

Now, start Alfresco and look into log file. There should be no errors related to user synchronization. For additional check, go to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Alfresco Web console (as user admin) and get user list. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user list should appear users pulled from FreeIPA. Also, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 log file you should see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lines about successful LDAP synchronization.

Ok, now stop tomcat again and let's proceed to Kerberos integration.

Integrating with Kerberos


First, we need to add HTTP service principal and retrieve its keytab. To do that first you need to create principal, so go to IPA administration console and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n select Services tab. You'll see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re predefined services for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ipa host itself. Click on Add button and fill in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fields so that service's type and name is HTTP and for host name select host on which alfresco is running (i.e. alfresco.example-domain.local).

Now, go to Alfresco host and first obtain admin ticket:
# kinit admin
Password for admin@EXAMPLE-DOMAIN.COM:
Then, obtain ticket for Alfresco HTTP service using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following command:
# ipa-getkeytab -k /etc/alfrescohttp.keytab -p HTTP/alfresco.example-domain.local@EXAMPLE-DOMAIN.COM -s -P
New Principal Password:
Verify Principal Password:

ipa.example-domain.localKeytab successfully retrieved and stored in: /etc/alfrescohttp.keytab
Again, open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file $WEBAPPS/alfresco/WEB-INF/classes/alfresco-global.properties and modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 variable aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.chain to have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following value:
 aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.chain=alfrescoNtlm1:alfrescoNtlm,krb:kerberos,ldap1:ldap
we are basically adding Kerberos into aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication chain. Now, go to directory $WEBAPPS/alfresco/WEB-INF/classes/alfresco/subsystems/Aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication/kerberos and open file kerberos-aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.properties in text editor. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file, only one line is important and that is aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticateCIFS which should be set to false:
kerberos.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.realm=EXAMPLE.COM
kerberos.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.user.configEntryName=Alfresco
kerberos.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.defaultAdministratorUserNames=
kerberos.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.cifs.configEntryName=AlfrescoCIFS
kerberos.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.cifs.password=secret
kerberos.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticateCIFS=false
Note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is also variable kerberos.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.http.password and in case you protected alfresco's http ticket with pasword you'll have to use that variable to tell alfresco which password to use to unlock ticket.

Now, open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file  kerberos-filter.properties that is in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same directory as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kerberos-aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.properties file. In this file set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of property kerberos.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.http.password to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password you entered when you've run ipa-getkeytab command.

Now, go to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 directory /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/security/. Note that if you are using ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r version of Java you should change directory name to reflect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java version. In that directory create file named java.login.config with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following content:
Alfresco {
   com.sun.security.auth.module.Krb5LoginModule sufficient;
};
AlfrescoCIFS {
   com.sun.security.auth.module.Krb5LoginModule required
   storeKey=true
   useKeyTab=true
   keyTab="/etc/alfrescocifs.keytab"
   principal="cifs/.";
};
AlfrescoHTTP {
   com.sun.security.auth.module.Krb5LoginModule required
   storeKey=true
   useKeyTab=true
   keyTab="/etc/alfrescohttp.keytab"
   principal="HTTP/alfresco.example-domain.local@EXAMPLE-DOMAIN.LOCAL";
};
com.sun.net.ssl.client {
   com.sun.security.auth.module.Krb5LoginModule sufficient;
};
ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r {
   com.sun.security.auth.module.Krb5LoginModule sufficient;
};
In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same directory in which you created java.login.config you'll find file java.security. Open it and find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following line:
#login.config.url.1=file:${user.home}/.java.login.config
Uncomment it and change it, or add anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r one, that reads like this:
login.config.url.1=file:${java.home}/lib/security/java.login.config
Save and close cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file.

Now to test if everything is working as expected...

Testing kerberos aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication


To test if kerberos aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication is working you need properly configured Firefox browser and a computer on which you can request tickets (via kinit command).

To be able to request Kerberos tickets use ipa-client-install command on some workstation. This will configure DNS resolution and /etc/krb5.conf file. Alternatively, if you don't want or can not run ipa-client-install, you can copy /etc/krb5.conf from Alfresco to some computer and change /etc/resolv.conf to point to IPA server. Then issue ticket for, e.g. admin@EXAMPLE-DOMAIN.COM principal. To have Firefox browser properly configured go to IPA Web UI (see my previous post about IPA installation for details). This will configure Firefox to handle Kerberos tickets.

Finally, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Firefox browser enter Alfresco's URL, i.e. https://alfresco.example-domain.local/alfresco/. What should happen is that you should be automatically logged in as admin user (or whichever user's ticket you obtained).

As an additional test you can do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following. First, select Logout in Alfresco's Web console. You are now presented with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 option to Re-login. If you click that link you'll be logged in again. But, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 command line run kdestroy which will remove your ticket. Click on Re-login now! What should happen is that you are presented with a Alfresco's Login screen.

Error messages


Here are error messages I had to resolve why trying to configure Alfresco and FreeIPA, in case you stumble on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to know what's wrong.

07:53:32,266 ERROR [org.alfresco.fileserver] CIFS server configuration error, Error creating bean with name 'aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticationComponent' defined in file [/var/lib/tomcat6/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/Aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication/ldap/../common-ldap-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'boolean' for property 'active'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${ldap.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.active}]

This is CIFS server complaining that no aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication is defined. But, since I don't want CIFS, I simply disabled it by editing file file-servers.properties in directory $WEBAPPS/alfresco/WEB-INF/classes/alfresco/subsystems/fileServers/default.


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticationComponent' defined in file [/var/lib/tomcat6/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/Aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication/ldap/../common-ldap-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'boolean' for property 'active'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${ldap.aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication.active}]

This one was real pain to discover what's wrong. Namely, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value was set to false, which is (you guessed it) boolean!? But Alfresco claims it's not. What happened actually is that I moved properties file in anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r directory and Alfresco couldn't find it. So, variables were not initialized and obviously cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were left as is instead of being replaced with values, in this case false.

20:16:23,243 ERROR [org.alfresco.web.app.servlet.KerberosAucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticationFilter] HTTP Kerberos web filter error
javax.security.auth.login.LoginException: Integrity check on decrypted field failed (31) - PREAUTH_FAILED
    at com.sun.security.auth.module.Krb5LoginModule.attemptAucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication(Krb5LoginModule.java:713)
    at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:559)
For this message question on Stackoverflow was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first info I managed to find. Then, I stumbled on this post, but it didn't help eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. The latest info about this is this post. After I published initial version of this post I realized that I was actually configuring CIFS instead of HTTP. In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, I had to disable CIFS and properly configure HTTP. The text is updated now.

In case you see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous entry in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 log file than one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reasons could be that keytab is encrypted but you (that is application) is trying to decrypt it using a wrong key/passpharse.

3 comments:

Unknown said...

quick question... where you indicate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 creation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "java.login.config" do you need to change "principal="HTTP/alfresco.example-domain.local@EXAMPLE-DOMAIN.LOCAL";" with what our actual entry is that we created when we generated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keytab or is this line referencing something else?

Stjepan Groš (sgros) said...

Yes, that entry is specific to Alfresco, and thus it has to be changed.

Unknown said...

thank you so much for you quick turn around. I have one last hurdle (i hope) after following your kerberos config and making changes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 java.security and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 java.login.config i get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following error when i http connect to /alfresco or when i tail cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logs when trying to auth with an existing IPA user from /share

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'globalAucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticationFilter' defined in file [/opt/alfresco-4.0.d/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/Aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication/kerberos/kerberos-filter-context.xml]: Invocation of init method failed; nested exception is java.lang.SecurityException: Unable to locate a login configuration
caused by:
java.lang.SecurityException: Unable to locate a login configuration
caused by:
java.io.IOException: Unable to locate a login configuration

what did I do wrong?

About Me

scientist, consultant, security specialist, networking guy, system administrator, philosopher ;)

Blog Archive