Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
tutorial:adm:czechidm_installation [2020/03/12 14:43] urbanl old revision restored (2020/03/11 11:55) |
tutorial:adm:czechidm_installation [2021/11/02 13:48] steinhartm [5. Create CzechIdM configuration] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Installation of CzechIdM - Linux ====== | + | ====== Installation of CzechIdM - Linux - CentOS8 |
{{tag> | {{tag> | ||
- | We presume | + | We expect |
- | This tutorial shows how to install full production-ready version of CzechIdM on standard software setup (java, postgreSQL, Tomcat, Apache | + | This tutorial shows how to install full production-ready version of CzechIdM on standard software setup (Java, PostgreSQL, Tomcat, Apache |
- | <note tip>If you install CzechIdM on Sql server | + | <note tip>If you install CzechIdM on with Microsoft SQL Server database backend, |
==== 1. Create DB user and database in PostgreSQL ==== | ==== 1. Create DB user and database in PostgreSQL ==== | ||
Switch the user from root to postgres and use **psql** to add the user and database into PostgreSQL: | Switch the user from root to postgres and use **psql** to add the user and database into PostgreSQL: | ||
Line 15: | Line 15: | ||
psql | psql | ||
CREATE USER czechidm PASSWORD ' | CREATE USER czechidm PASSWORD ' | ||
- | CREATE DATABASE " | + | |
+ | # Choose appropriate collation and create database. | ||
+ | # with czech collation (- typical) | ||
+ | CREATE DATABASE " | ||
+ | # or with english collation | ||
+ | # CREATE DATABASE " | ||
</ | </ | ||
Line 35: | Line 40: | ||
and restart PostgreSQL. | and restart PostgreSQL. | ||
</ | </ | ||
- | ==== 2. JDBC driver installation - CentOS7 | + | ==== 2. JDBC driver installation - CentOS8 |
**CentOS** | **CentOS** | ||
- | Install the package with PostgreSQL JDBC driver: | + | Download |
+ | In this example we download version 42.2.11. | ||
<code bash> | <code bash> | ||
- | yum install -y postgresql-jdbc | + | wget https:// |
</ | </ | ||
- | allow Tomcat to use the driver: | + | ==== 3. Configure environment properties. Select application profile ==== |
- | + | ||
- | <code bash> | + | |
- | ln -s / | + | |
- | </ | + | |
- | + | ||
- | ==== 3. JDBC driver installation - Debian ==== | + | |
- | + | ||
- | Install the package with PostgreSQL JDBC driver: | + | |
- | + | ||
- | <code bash> | + | |
- | apt-get install libpostgresql-jdbc-java | + | |
- | </ | + | |
- | + | ||
- | allow Tomcat to use the driver: | + | |
- | + | ||
- | <code bash> | + | |
- | ln -s / | + | |
- | </ | + | |
- | ==== 4. Configure environment properties. Select application profile ==== | + | |
Edit the configuration file ''/ | Edit the configuration file ''/ | ||
< | < | ||
- | <note important> | ||
- | < | ||
- | Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: | ||
- | </ | ||
Change the following line: | Change the following line: | ||
Line 79: | Line 62: | ||
into: | into: | ||
<code bash> | <code bash> | ||
- | Environment=' | + | Environment=' |
</ | </ | ||
Line 86: | Line 69: | ||
systemctl daemon-reload | systemctl daemon-reload | ||
</ | </ | ||
- | ==== 5. Create CzechIdM configuration folders ==== | + | ==== 4. Create CzechIdM configuration folders ==== |
In CzechIdM, you can store all deployment-specific configuration (i.e. database credentials) outside the war file. This is a configure-once approach which greatly simplifies future deployments. | In CzechIdM, you can store all deployment-specific configuration (i.e. database credentials) outside the war file. This is a configure-once approach which greatly simplifies future deployments. | ||
* The **etc** directory stores configuration files. | * The **etc** directory stores configuration files. | ||
Line 100: | Line 83: | ||
- | ==== 6. Create CzechIdM configuration ==== | + | ==== 5. Create CzechIdM configuration ==== |
- | Now we will create configuration files the CzechIdM will use. | + | |
- | < | + | Now we will create configuration files the CzechIdM will use. < |
- | * The **/ | + | |
- | cat / | + | * The **/ |
+ | |||
+ | < | ||
+ | cat / | ||
</ | </ | ||
- | | + | |
+ | | ||
+ | |||
+ | <file properties quartz-production.properties> | ||
org.quartz.scheduler.instanceName=idm-scheduler-instance | org.quartz.scheduler.instanceName=idm-scheduler-instance | ||
org.quartz.scheduler.instanceId=AUTO | org.quartz.scheduler.instanceId=AUTO | ||
Line 118: | Line 108: | ||
org.quartz.jobStore.misfireThreshold=60000 | org.quartz.jobStore.misfireThreshold=60000 | ||
org.quartz.jobStore.tablePrefix=qrtz_ | org.quartz.jobStore.tablePrefix=qrtz_ | ||
+ | |||
+ | |||
</ | </ | ||
- | | + | |
+ | | ||
+ | |||
+ | <file xml logback-spring.xml> | ||
<?xml version=" | <?xml version=" | ||
<!-- https:// | <!-- https:// | ||
<!-- http:// | <!-- http:// | ||
< | < | ||
+ | <!-- !!!BEWARE!!! The specification of the LOG PATTERNS overrides the default configuration and increases the maximum length of the %logger{< | ||
+ | It is neccessary for correct function of the AUDIT logging feature (redmine ticket #2717). If AUDIT logger key is longer then the set limit it gets shortened | ||
+ | and SIEM software is not able to parse logs properly. --> | ||
+ | < | ||
+ | < | ||
+ | |||
<include resource=" | <include resource=" | ||
< | < | ||
Line 132: | Line 133: | ||
<logger name=" | <logger name=" | ||
<logger name=" | <logger name=" | ||
+ | <logger name=" | ||
</ | </ | ||
- | < | + | < |
- | <logger name=" | + | |
- | <logger name=" | + | |
- | <logger name=" | + | |
- | <logger name=" | + | |
- | <logger name=" | + | |
- | </ | + | |
- | + | ||
- | < | + | |
< | < | ||
< | < | ||
Line 148: | Line 142: | ||
< | < | ||
- | < | + | < |
< | < | ||
< | < | ||
Line 162: | Line 156: | ||
</ | </ | ||
- | <logger name=" | + | <logger name=" |
< | < | ||
</ | </ | ||
<logger name=" | <logger name=" | ||
- | <logger name=" | + | <logger name=" |
- | <logger name=" | + | <logger name=" |
- | <logger name=" | + | <logger name=" |
- | </springProfile> | + | <logger name=" |
- | < | ||
- | <logger name=" | ||
- | <logger name=" | ||
- | <logger name=" | ||
- | <logger name=" | ||
- | <logger name=" | ||
</ | </ | ||
+ | |||
</ | </ | ||
+ | |||
+ | |||
</ | </ | ||
- | | + | |
+ | | ||
+ | |||
+ | <file properties application-production.properties> | ||
# Doc: https:// | # Doc: https:// | ||
- | + | ||
idm.pub.app.instanceId=idm-primary | idm.pub.app.instanceId=idm-primary | ||
idm.pub.app.stage=production | idm.pub.app.stage=production | ||
- | + | ||
spring.datasource.url=jdbc: | spring.datasource.url=jdbc: | ||
spring.datasource.username=czechidm | spring.datasource.username=czechidm | ||
Line 195: | Line 189: | ||
spring.jpa.hibernate.ddl-auto=none | spring.jpa.hibernate.ddl-auto=none | ||
flyway.enabled=true | flyway.enabled=true | ||
- | + | ||
- | scheduler.enabled=true | + | |
- | scheduler.task.queue.process=1000 | + | |
- | scheduler.event.queue.process=1000 | + | |
scheduler.properties.location=quartz-production.properties | scheduler.properties.location=quartz-production.properties | ||
+ | |||
logging.config=/ | logging.config=/ | ||
+ | |||
idm.sec.core.demo.data.enabled=false | idm.sec.core.demo.data.enabled=false | ||
- | + | ||
- | #spring.cache.ehcache.config=classpath: | + | # attachments will be stored under this path. |
- | + | # new directories for attachment will be created in this folder (permissions has to be added) | |
- | spring.activiti.processDefinitionLocationPrefix=classpath*:/ | + | # System.getProperty(" |
- | idm.sec.core.notification.template.folder=classpath*:/eu/ | + | idm.sec.core.attachment.storagePath=/opt/czechidm/data |
- | idm.sec.core.script.folder=classpath*:/ | + | # configuration property for default backup |
- | # configuration property for default backup | + | |
idm.sec.core.backups.default.folder.path=/ | idm.sec.core.backups.default.folder.path=/ | ||
- | + | ||
- | + | ||
idm.pub.security.allowed-origins=http:// | idm.pub.security.allowed-origins=http:// | ||
# Generate JWT token security string as "cat / | # Generate JWT token security string as "cat / | ||
Line 218: | Line 209: | ||
idm.sec.security.jwt.expirationTimeout=36000000 | idm.sec.security.jwt.expirationTimeout=36000000 | ||
- | # recaptcha | ||
- | # - recaptchaservice endpoint | ||
- | # | ||
- | # - secret key, can be generated here https:// | ||
- | idm.sec.security.recaptcha.secretKey=xxx | ||
- | # Proxy for HTTP requests | ||
- | # | ||
- | |||
# Cipher secret key for crypt values in confidential storage | # Cipher secret key for crypt values in confidential storage | ||
# for crypt values is used secretKey or secretKey defined by file - secretKeyPath | # for crypt values is used secretKey or secretKey defined by file - secretKeyPath | ||
# | # | ||
cipher.crypt.secret.keyPath=/ | cipher.crypt.secret.keyPath=/ | ||
- | + | ||
- | + | # Defaults for: emailer.* | |
+ | # test.enabled=true means mail WILL NOT be sent | ||
idm.sec.core.emailer.test.enabled=true | idm.sec.core.emailer.test.enabled=true | ||
# http:// | # http:// | ||
Line 240: | Line 224: | ||
# idm.sec.core.emailer.password=password | # idm.sec.core.emailer.password=password | ||
idm.sec.core.emailer.from=czechidm@localhost | idm.sec.core.emailer.from=czechidm@localhost | ||
- | + | ||
- | ## Global property that allow disable or enable sending notification from WF | + | |
- | idm.sec.core.wf.notification.send=false | + | |
- | + | ||
- | + | ||
- | # supports delete identity | + | |
- | idm.pub.core.identity.delete=true | + | |
- | # | + | |
- | # default password change type for custom users, one of values: | + | |
- | # DISABLED - password change is disable | + | |
- | # ALL_ONLY - users can change passwords only for all accounts | + | |
- | # CUSTOM - users can choose for which accounts change password | + | |
- | idm.pub.core.identity.passwordChange=ALL_ONLY | + | |
- | # | + | |
- | # required old password for change password | + | |
- | idm.pub.core.identity.passwordChange.requireOldPassword=true | + | |
- | # | + | |
- | # create default identity' | + | |
- | idm.pub.core.identity.create.defaultContract.enabled=true | + | |
- | + | ||
- | + | ||
# Default user role will be added automatically, | # Default user role will be added automatically, | ||
# could contains default authorities and authority policies configuration | # could contains default authorities and authority policies configuration | ||
Line 267: | Line 231: | ||
# Admin user role | # Admin user role | ||
idm.sec.core.role.admin=superAdminRole | idm.sec.core.role.admin=superAdminRole | ||
- | |||
- | |||
- | # ID system against which to authenticate | ||
- | idm.sec.security.auth.systemId= | ||
- | |||
- | # attachments will be stored under this path. | ||
- | # new directories for attachment will be created in this folder (permissions has to be added) | ||
- | # System.getProperty(" | ||
- | idm.sec.core.attachment.storagePath=/ | ||
# Max file size of uploaded file. Values can use the suffixed " | # Max file size of uploaded file. Values can use the suffixed " | ||
spring.servlet.multipart.max-file-size=100MB | spring.servlet.multipart.max-file-size=100MB | ||
spring.servlet.multipart.max-request-size=100MB | spring.servlet.multipart.max-request-size=100MB | ||
+ | |||
+ | |||
</ | </ | ||
=== Adjust database configuration === | === Adjust database configuration === | ||
- | If you followed this howto, the only thing you should need to adjust is a **spring.datasource.password** propetry. Set it to the password for czechidm user in PostgreSQL. | + | |
- | If necessary, adjust other database connection properties... <code properties> | + | If you followed this howto, the only thing you should need to adjust is a **spring.datasource.password** |
+ | |||
+ | <code properties> | ||
spring.datasource.url=jdbc: | spring.datasource.url=jdbc: | ||
spring.datasource.username=czechidm | spring.datasource.username=czechidm | ||
Line 291: | Line 250: | ||
spring.datasource.validationQuery=SELECT 1 | spring.datasource.validationQuery=SELECT 1 | ||
spring.datasource.test-on-borrow=true | spring.datasource.test-on-borrow=true | ||
+ | |||
+ | |||
</ | </ | ||
=== Generate JWT token === | === Generate JWT token === | ||
- | Set value of the **idm.sec.security.jwt.secret.token** property as is described in the template file:< | + | |
+ | Set value of the **idm.sec.security.jwt.secret.token** | ||
+ | |||
+ | <code properties> | ||
# Generate JWT token security string as "cat / | # Generate JWT token security string as "cat / | ||
# We recommend the VALUE to be at least 25. | # We recommend the VALUE to be at least 25. | ||
idm.sec.security.jwt.secret.token=********** TODO ********* | idm.sec.security.jwt.secret.token=********** TODO ********* | ||
+ | |||
+ | |||
</ | </ | ||
=== Local confidential storage === | === Local confidential storage === | ||
- | Local confidential storage is encrypted by AES algoritm. [[https:// | + | Local confidential storage is encrypted by AES algoritm. [[https:// |
- | Confidential storage is encrypted by a key found in **secret.key** file you already created. | + | |
There are two properties in application-production.properties that influence the confidential storage: | There are two properties in application-production.properties that influence the confidential storage: | ||
- | | + | |
- | * you can create separate file (in our case **secret.key**) containing a random string. Then you reference this file with **cipher.crypt.secret.keyPath** property. | + | |
+ | * or (better) | ||
<note warning> | <note warning> | ||
- | Confidential storage uses AES/ | + | Confidential storage uses AES/ |
+ | |||
+ | * OpenJDK/JDK 1.8u161 and all higher versions support AES-256 by default. | ||
+ | * Older versions (below 1.8u161) do not offer it. On those Java distributions, | ||
+ | |||
+ | </ | ||
=== Attachment store === | === Attachment store === | ||
- | In CzechIdM, users can sometimes add attachments (say, attach *.jpeg photo to their employee card request). Those files are stored in the attachment store. | + | |
- | With the following property, you can configure, where the store is. If you used sample property file, the store is by-default located under / | + | In CzechIdM, users can sometimes add attachments (say, attach *.jpeg photo to their employee card request). Those files are stored in the attachment store. With the following property, you can configure, where the store is. If you used sample property file, the store is by-default located under / |
<code properties> | <code properties> | ||
Line 322: | Line 293: | ||
# System.getProperty(" | # System.getProperty(" | ||
idm.sec.core.attachment.storagePath=/ | idm.sec.core.attachment.storagePath=/ | ||
+ | |||
+ | |||
</ | </ | ||
=== Environment === | === Environment === | ||
- | If you install CzechIdM in multiple environments (typically test and production), | + | If you install CzechIdM in multiple environments (typically test and production), |
<code properties> | <code properties> | ||
# Application stage (development, | # Application stage (development, | ||
idm.pub.app.stage=production | idm.pub.app.stage=production | ||
- | </ | ||
+ | </ | ||
- | ==== 7. Set correct permissions on CzechIdM files ==== | + | |
- | **CentOS** | + | ==== 6. Set correct permissions on CzechIdM files ==== |
< | < | ||
chown tomcat: | chown tomcat: | ||
Line 343: | Line 317: | ||
</ | </ | ||
- | ==== 8. Adjust Tomcat' | + | ==== 7. Adjust Tomcat' |
- | Apache Tomcat has to know where the new configuration is. Because CzechIdM uses SpringBoot project, we simply add the **/ | + | Apache Tomcat has to know where the new configuration is. Because CzechIdM uses SpringBoot project, we simply add the '' |
- | Create new file **/ | + | Create new file '' |
<code bash:> | <code bash:> | ||
Line 357: | Line 331: | ||
</ | </ | ||
- | ==== 9. Create dedicated Java truststore ==== | + | ==== 8. Create dedicated Java truststore ==== |
Java truststore is a file which contains SSL certificates which we consider trusted. Usually this means some certificates of end systems or their respective certificate authorities. | Java truststore is a file which contains SSL certificates which we consider trusted. Usually this means some certificates of end systems or their respective certificate authorities. | ||
When we need CzechIdM to communicate with some new system with SSL-encrypted way, we need to import particular certificate here and restart the Tomcat container. | When we need CzechIdM to communicate with some new system with SSL-encrypted way, we need to import particular certificate here and restart the Tomcat container. | ||
Line 384: | Line 358: | ||
systemctl restart tomcat.service | systemctl restart tomcat.service | ||
</ | </ | ||
- | ==== 10. Deploy the CzechIdM ==== | + | ==== 9. Deploy the CzechIdM ==== |
- | Download the latest CzechIdM version. Currently it is idm-app-9.4.0.war. | + | Download the latest CzechIdM version. Currently it is idm-app-10.4.1.war. |
Ensure Tomcat is stopped: | Ensure Tomcat is stopped: | ||
Line 391: | Line 365: | ||
systemctl stop tomcat.service | systemctl stop tomcat.service | ||
</ | </ | ||
- | Copy the identity manager WAR into webapps folder in Tomcat and name it **idm.war**: | + | Copy the identity manager WAR into webapps folder in Tomcat and name it '' |
< | < | ||
- | cp idm-app-9.4.0.war / | + | cp idm-app-10.4.1.war / |
- | chown tomcat: | + | |
</ | </ | ||
Start the Tomcat container:< | Start the Tomcat container:< | ||
systemctl start tomcat.service | systemctl start tomcat.service | ||
</ | </ | ||
- | If everything is set up right, the CzechIdM will deploy. Default log is **/ | + | If everything is set up right, the CzechIdM will deploy. Default log is '' |
- | ==== 11. Final Steps ==== | + | ==== 10. Final Steps ==== |
=== Allow network services === | === Allow network services === | ||
Line 408: | Line 381: | ||
<code bash> | <code bash> | ||
+ | firewall-cmd --permanent --add-port=80/ | ||
firewall-cmd --permanent --add-port=443/ | firewall-cmd --permanent --add-port=443/ | ||
firewall-cmd --reload | firewall-cmd --reload |