Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
tutorial:adm:czechidm_installation [2019/03/13 10:18] urbanl [Set correct permissions on CzechIdM files] |
tutorial:adm:czechidm_installation [2022/12/20 10:09] kralikf [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 | ||
+ | |||
+ | <note tip>If you install CzechIdM on with Microsoft SQL Server database backend, please skip PostgreSQL-related sections and [[.:mssql_database_support|swap them for this tutorial]] instead.</ | ||
- | This tutorial shows how to install full production-ready version of CzechIdM on standard software setup (java, postgreSQL, Tomcat, Apache httpd). If you are looking for a demo installation please see [[: | ||
- | <note tip>If you install CzechIdM on Sql server please skip instruction with setup DB and install JDBC driver and [[tutorial: | ||
==== 1. Create DB user and database in PostgreSQL ==== | ==== 1. Create DB user and database in PostgreSQL ==== | ||
+ | If czech database collation should be used, install the czech language packs. | ||
+ | <code bash> | ||
+ | dnf install langpacks-cs | ||
+ | </ | ||
+ | |||
+ | |||
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 23: | ||
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 48: | ||
and restart PostgreSQL. | and restart PostgreSQL. | ||
</ | </ | ||
- | ==== 2. JDBC driver installation - CentOS7 | + | ==== 2. JDBC driver installation |
+ | **CentOS** | ||
- | + | Download | |
- | Install the package with PostgreSQL JDBC driver: | + | 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> | + | Edit the configuration file '' |
- | ln -s /usr/share/java/postgresql-jdbc.jar / | + | |
- | </code> | + | |
- | ==== 3. JDBC driver installation - Debian ==== | + | Change the following line: |
+ | <code bash> | ||
+ | Environment=' | ||
- | Install the package with PostgreSQL JDBC driver: | ||
- | |||
- | <code bash> | ||
- | apt-get install libpostgresql-jdbc-java | ||
</ | </ | ||
- | allow Tomcat to use the driver: | + | into: |
<code bash> | <code bash> | ||
- | ln -s /usr/share/ | + | Environment=' |
- | </ | + | |
- | ==== 4. Configure environment properties. Select application profile ==== | + | |
- | Edit the configuration file ''/ | + | </code> |
- | < | + | |
- | <note important> | + | Reload systemd after the changes: |
- | < | + | |
- | Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: | + | |
- | </ | + | |
- | Change the following line: | ||
<code bash> | <code bash> | ||
- | Environment=' | + | systemctl daemon-reload |
- | </ | + | |
- | into: | + | |
- | <code bash> | + | |
- | Environment=' | + | |
- | </ | + | |
- | Reload systemd after the changes: | ||
- | <code bash> | ||
- | 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 94: | Line 90: | ||
* The **backup** directory stored Groovy scripts backups. | * The **backup** directory stored Groovy scripts backups. | ||
* The **data** directory stores various user-attached files. | * The **data** directory stores various user-attached files. | ||
+ | * | ||
Create the directory structure: | Create the directory structure: | ||
< | < | ||
Line 100: | Line 96: | ||
</ | </ | ||
- | ==== 6. Create CzechIdM configuration ==== | + | |
- | Now we will create configuration files the CzechIdM will use. | + | |
- | < | + | ==== 5. Create CzechIdM configuration ==== |
- | * The **/ | + | |
- | cat / | + | Now we will create configuration files the CzechIdM will use. < |
+ | |||
+ | * 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 123: | ||
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 148: | ||
<logger name=" | <logger name=" | ||
<logger name=" | <logger name=" | ||
+ | <logger name=" | ||
</ | </ | ||
- | < | + | < |
- | <logger name=" | + | |
- | <logger name=" | + | |
- | <logger name=" | + | |
- | <logger name=" | + | |
- | <logger name=" | + | |
- | </ | + | |
- | + | ||
- | < | + | |
< | < | ||
< | < | ||
Line 148: | Line 157: | ||
< | < | ||
- | < | + | < |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | </ | + | |
</ | </ | ||
Line 162: | Line 166: | ||
</ | </ | ||
- | <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.jdbcUrl=jdbc: |
spring.datasource.username=czechidm | spring.datasource.username=czechidm | ||
spring.datasource.password=********** TODO ********* | spring.datasource.password=********** TODO ********* | ||
Line 195: | Line 199: | ||
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 219: | ||
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 234: | ||
# 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 241: | ||
# 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. | + | # Max file size of uploaded file. Values can use the suffixed " |
- | # new directories for attachment will be created in this folder (permissions has to be added) | + | spring.servlet.multipart.max-file-size=100MB |
- | # System.getProperty(" | + | spring.servlet.multipart.max-request-size=100MB |
- | idm.sec.core.attachment.storagePath=/ | + | |
</ | </ | ||
=== 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 287: | Line 260: | ||
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 318: | Line 303: | ||
# 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 | ||
+ | |||
+ | |||
</ | </ | ||
- | ==== Set correct permissions on CzechIdM files ==== | + | |
+ | ==== 6. Set correct permissions on CzechIdM files ==== | ||
< | < | ||
chown tomcat: | chown tomcat: | ||
Line 335: | Line 326: | ||
chmod 640 / | chmod 640 / | ||
</ | </ | ||
- | ==== Adjust Tomcat' | ||
- | Apache Tomcat has to know where the new configuration is. Because CzechIdM uses SpringBoot project, we simply add the **/ | ||
- | Create new file **/ | + | ==== 7. Adjust Tomcat' |
+ | Apache Tomcat has to know where the new configuration is. Because CzechIdM uses SpringBoot project, we simply add the ''/ | ||
+ | |||
+ | Create new file '' | ||
+ | |||
+ | <code bash:> | ||
CLASSPATH=/ | CLASSPATH=/ | ||
</ | </ | ||
- | And change owner of the file to tomcat:< | + | |
+ | And change owner of the file to tomcat: | ||
+ | < | ||
chown root:tomcat / | chown root:tomcat / | ||
</ | </ | ||
- | ==== 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 372: | Line 368: | ||
systemctl restart tomcat.service | systemctl restart tomcat.service | ||
</ | </ | ||
- | ==== Deploy the CzechIdM ==== | + | ==== 9. Deploy the CzechIdM ==== |
- | Download the latest CzechIdM version. Currently it is idm-app-7.6.1.war. | + | Download the latest CzechIdM version. Currently it is idm-app-10.4.1.war. |
- | Ensure Tomcat is stopped:< | + | |
+ | Ensure Tomcat is stopped: | ||
+ | < | ||
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-7.6.1.war / | + | < |
+ | cp idm-app-10.4.1.war / | ||
</ | </ | ||
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 **/ | + | |
- | ===== Allow network services | + | ==== 10. Final Steps ==== |
+ | |||
+ | === Allow network services === | ||
Firewall may restrict the access to all port except ssh (22/tcp). To be able to use CzechIdM, allow port 443/tcp and reload firewalld: | Firewall may restrict the access to all port except ssh (22/tcp). To be able to use CzechIdM, allow port 443/tcp and reload firewalld: | ||
<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 | ||
</ | </ | ||
- | ===== Change default admin password | + | === Change default admin password === |
In the fresh CzechIdM installation, | In the fresh CzechIdM installation, | ||
- | ===== Configure IdM ===== | + | === Configure IdM === |
Follow some final configuration steps: [[tutorial: | Follow some final configuration steps: [[tutorial: | ||
+ |