Rocky Linux 10 搭建 Jira Data Center 并集成 OpenLDAP 与 CAS 单点登录

Jira Data Center 是 Atlassian 面向企业自托管场景提供的项目、需求、缺陷、流程和敏捷研发管理平台。企业部署 Jira 后,通常需要接入现有 LDAP 用户目录和统一单点登录平台。

推荐身份架构:

1
2
3
OpenLDAP:保存人员、用户组和账号状态
Apereo CAS:使用 LDAP 验证用户,并提供 SAML 2.0 IdP
Jira Data Center:通过 LDAP 获取用户与组,通过原生 SAML SSO 接入 CAS

这里必须先说明两个边界:

  1. Jira Data Center 原生支持 LDAP 用户目录;
  2. Jira Data Center 原生企业 SSO 是 SAML/OIDC,不原生支持 CAS Protocol。

因此生产推荐路线不是修改 Jira Tomcat Filter 强接 CAS,而是:

1
2
CAS 开启 SAML IdP
-> Jira 使用 Data Center 内置 SAML SSO

第三方 CAS Marketplace App 可以作为备选,但必须确认与 Jira 11.3、Java 21 和当前 Data Center 许可证兼容,并接受插件升级和供应商支持风险。

Jira Server 已结束支持。本文使用 Jira Data Center 11.3 作为版本基线,需要有效 Data Center License。Jira 11.3 使用 Java 21,Jira 10 起 Linux 生产安装采用官方 tar.gz 手工安装方式。Rocky Linux 并非 Atlassian 文档中逐项测试的主要发行版,正式采购和支持边界应向 Atlassian 确认。

一、整体架构

组件 地址 说明
Jira https://jira.example.com Jira Data Center 单节点
PostgreSQL 127.0.0.1:5432 Jira 数据库
OpenLDAP ldaps://ldap.example.com:636 用户目录
CAS https://sso.example.com/cas 统一认证与 SAML IdP
Rocky Linux 192.168.9.40 Jira 节点
sequenceDiagram
    participant U as 用户浏览器
    participant J as Jira Data Center
    participant C as CAS SAML IdP
    participant L as OpenLDAP

    U->>J: 访问 Jira
    J-->>U: 重定向到 CAS SAML IdP
    U->>C: 提交凭证
    C->>L: LDAP Bind 验证
    L-->>C: 返回 uid、mail、cn、memberOf
    C-->>U: 返回 SAML Response
    U->>J: POST Assertion
    J->>J: 匹配 LDAP 用户
    J-->>U: 建立 Jira Session

用户生命周期:

1
2
3
4
LDAP 创建和禁用用户
-> Jira LDAP Directory 同步用户与组
-> CAS SAML 登录匹配同一用户名
-> Jira Application Access、Group、Project Role 决定授权

二、资源规划

2.1 单节点建议

规模 CPU 内存 JVM Heap 数据盘
测试 4 核 8 GB 2 GB 100 GB SSD
小型生产 8 核 16 GB 4~6 GB 500 GB SSD
中型生产 16 核 32 GB 8~12 GB 1 TB SSD

Jira 性能受以下因素影响:

  • Issue、Project、Workflow、Custom Field 数量;
  • 用户和用户组数量;
  • Lucene Index;
  • PostgreSQL 延迟;
  • LDAP 同步;
  • Automation;
  • Marketplace App;
  • Attachment;
  • JVM GC;
  • Dashboard 和 JQL。

不要仅按在线用户数估算。

2.2 目录规划

1
2
3
4
5
/opt/atlassian/jira-11.3.x      安装目录
/opt/atlassian/jira 当前版本软链接
/var/atlassian/application-data/jira Jira Home
/var/log/jira systemd/额外日志
/backup/jira 备份目录

Jira Home 不得放在安装目录内部。

三、系统初始化

1
2
3
4
cat /etc/rocky-release
uname -r
uname -m
hostnamectl
1
2
3
4
hostnamectl set-hostname jira01.example.com
timedatectl set-timezone Asia/Shanghai
systemctl enable --now chronyd
chronyc tracking
1
2
3
4
5
6
7
8
9
dnf clean all
dnf makecache
dnf upgrade -y

dnf install -y \
vim curl wget tar gzip unzip jq \
fontconfig dejavu-sans-fonts \
bind-utils lsof policycoreutils-python-utils \
firewalld nginx java-21-openjdk-devel
1
2
java -version
javac -version

Jira 11.3 不能使用 Java 8、11 或 17。

保持 SELinux:

1
2
getenforce
systemctl enable --now firewalld

四、安装 PostgreSQL 17

4.1 安装 PGDG 仓库

1
2
3
4
5
6
7
8
dnf install -y \
https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm

dnf -qy module disable postgresql

dnf install -y \
postgresql17-server \
postgresql17-contrib

初始化:

1
2
/usr/pgsql-17/bin/postgresql-17-setup initdb
systemctl enable --now postgresql-17

检查:

1
2
systemctl status postgresql-17 --no-pager -l
sudo -u postgres psql -c 'SELECT version();'

4.2 创建 Jira 数据库

1
sudo -u postgres psql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE ROLE jira
LOGIN
PASSWORD '替换为高强度密码'
NOSUPERUSER
NOCREATEDB
NOCREATEROLE
NOREPLICATION;

CREATE DATABASE jiradb
WITH OWNER = jira
ENCODING = 'UTF8'
LC_COLLATE = 'C'
LC_CTYPE = 'C'
TEMPLATE = template0;

\c jiradb

GRANT ALL PRIVILEGES ON SCHEMA public TO jira;

\q

生产环境应将数据库密码放入密码管理系统,不写入 Git 或博客脚本。

4.3 限制数据库监听

编辑:

1
vim /var/lib/pgsql/17/data/postgresql.conf

单机部署:

1
2
3
listen_addresses = '127.0.0.1'
port = 5432
max_connections = 200

pg_hba.conf

1
host    jiradb    jira    127.0.0.1/32    scram-sha-256
1
systemctl restart postgresql-17

测试:

1
2
psql \
'host=127.0.0.1 port=5432 dbname=jiradb user=jira sslmode=disable'

五、安装 Jira Data Center

5.1 创建运行用户

1
2
3
4
5
6
useradd \
--system \
--create-home \
--home-dir /opt/atlassian \
--shell /bin/bash \
jira
1
2
3
4
5
6
7
8
9
mkdir -p /opt/atlassian
mkdir -p /var/atlassian/application-data/jira
mkdir -p /var/log/jira
mkdir -p /backup/jira

chown -R jira:jira \
/opt/atlassian \
/var/atlassian \
/var/log/jira

5.2 下载 Jira

从 Atlassian 官方下载页确认当前 Jira Data Center 11.3 Patch。示例:

1
2
3
4
5
6
7
export JIRA_VERSION='11.3.x'

cd /tmp

curl -fL \
"https://product-downloads.atlassian.com/software/jira/downloads/atlassian-jira-software-${JIRA_VERSION}.tar.gz" \
-o "atlassian-jira-software-${JIRA_VERSION}.tar.gz"

11.3.x 替换为真实 Patch 版本。下载路径若变化,以官方 Download 页面为准。

解压:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tar -xzf \
"atlassian-jira-software-${JIRA_VERSION}.tar.gz" \
-C /opt/atlassian

mv \
"/opt/atlassian/atlassian-jira-software-${JIRA_VERSION}-standalone" \
"/opt/atlassian/jira-${JIRA_VERSION}"

ln -sfn \
"/opt/atlassian/jira-${JIRA_VERSION}" \
/opt/atlassian/jira

chown -h jira:jira /opt/atlassian/jira
chown -R jira:jira "/opt/atlassian/jira-${JIRA_VERSION}"

5.3 配置 Jira Home

编辑:

1
2
vim \
/opt/atlassian/jira/atlassian-jira/WEB-INF/classes/jira-application.properties
1
jira.home = /var/atlassian/application-data/jira

5.4 JVM 配置

编辑:

1
vim /opt/atlassian/jira/bin/setenv.sh

小型生产起点:

1
2
JVM_MINIMUM_MEMORY="4096m"
JVM_MAXIMUM_MEMORY="4096m"

追加:

1
2
3
4
5
6
7
8
CATALINA_PID="/var/atlassian/application-data/jira/catalina.pid"
export CATALINA_PID

JVM_SUPPORT_RECOMMENDED_ARGS="${JVM_SUPPORT_RECOMMENDED_ARGS} \
-XX:+UseG1GC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/atlassian/application-data/jira/heapdumps \
-Xlog:gc*,safepoint:file=/var/atlassian/application-data/jira/log/gc.log:time,uptime,level,tags:filecount=10,filesize=20M"
1
2
3
4
5
6
mkdir -p \
/var/atlassian/application-data/jira/heapdumps \
/var/atlassian/application-data/jira/log

chown -R jira:jira \
/var/atlassian/application-data/jira

不要把宿主机大部分内存全部分给 Heap。Jira、Lucene、线程栈、Direct Memory、PostgreSQL 和 OS Page Cache 都需要内存。

六、配置 Nginx 反向代理

6.1 修改 Jira Tomcat Connector

编辑:

1
vim /opt/atlassian/jira/conf/server.xml

找到 HTTP Connector,配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Connector
port="8080"
address="127.0.0.1"
maxThreads="200"
minSpareThreads="25"
connectionTimeout="20000"
enableLookups="false"
maxHttpHeaderSize="8192"
protocol="HTTP/1.1"
useBodyEncodingForURI="true"
redirectPort="8443"
acceptCount="100"
disableUploadTimeout="true"
bindOnInit="false"
secure="true"
scheme="https"
proxyName="jira.example.com"
proxyPort="443" />

Jira 只支持捆绑的 Tomcat,不要替换为系统 Tomcat。

6.2 systemd

创建 /etc/systemd/system/jira.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[Unit]
Description=Atlassian Jira Data Center
After=network-online.target postgresql-17.service
Wants=network-online.target
Requires=postgresql-17.service

[Service]
Type=forking
User=jira
Group=jira

Environment="JAVA_HOME=/usr/lib/jvm/java-21-openjdk"
Environment="JIRA_HOME=/var/atlassian/application-data/jira"

ExecStart=/opt/atlassian/jira/bin/start-jira.sh
ExecStop=/opt/atlassian/jira/bin/stop-jira.sh

PIDFile=/var/atlassian/application-data/jira/catalina.pid

Restart=on-failure
RestartSec=10s
TimeoutStartSec=600
TimeoutStopSec=180

LimitNOFILE=65536
TasksMax=65536

[Install]
WantedBy=multi-user.target
1
2
systemctl daemon-reload
systemctl enable --now jira
1
2
3
systemctl status jira --no-pager -l
journalctl -u jira -n 200 --no-pager
ss -lntp | grep 8080

6.3 Nginx 配置

证书:

1
2
/etc/nginx/ssl/jira.example.com.crt
/etc/nginx/ssl/jira.example.com.key

创建 /etc/nginx/conf.d/jira.example.com.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
upstream jira_backend {
server 127.0.0.1:8080;
keepalive 32;
}

server {
listen 80;
server_name jira.example.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
http2 on;
server_name jira.example.com;

ssl_certificate /etc/nginx/ssl/jira.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/jira.example.com.key;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:JIRA_SSL:20m;
ssl_session_timeout 1d;

client_max_body_size 2g;

location = /nginx-health {
access_log off;
default_type text/plain;
return 200 "ok\n";
}

location / {
proxy_pass http://jira_backend;
proxy_http_version 1.1;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;

proxy_set_header Connection "";

proxy_connect_timeout 10s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;

proxy_request_buffering off;
}
}

允许网络连接:

1
setsebool -P httpd_can_network_connect 1
1
2
3
nginx -t
systemctl enable --now nginx
systemctl reload nginx

防火墙:

1
2
3
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

七、完成 Jira 初始化向导

访问:

1
https://jira.example.com

选择外部数据库:

1
2
3
4
5
6
7
Database Type:PostgreSQL
Host:127.0.0.1
Port:5432
Database:jiradb
Username:jira
Password:数据库密码
Schema:public

然后:

  1. 输入 Jira Data Center License;
  2. 设置 Base URL;
  3. 创建本地管理员;
  4. 配置 SMTP;
  5. 完成索引;
  6. 验证附件和 Issue 创建。

必须保留本地管理员作为 SSO 故障回退。

八、Jira 集成 LDAP

进入:

1
2
3
4
5
Administration
-> User management
-> User directories
-> Add directory
-> LDAP

推荐目录类型:

1
Read Only, with Local Groups

含义:

  • 用户和目录组来自 LDAP;
  • Jira 不修改 LDAP 用户;
  • Jira 可以维护本地授权组;
  • 身份源与应用权限解耦。

8.1 基础配置

配置项 示例
Directory Type OpenLDAP
Hostname ldap.example.com
Port 636
Use SSL
Username cn=jira-reader,ou=system,dc=example,dc=com
Password Reader 密码
Base DN dc=example,dc=com

8.2 User Schema

Jira 字段 LDAP 属性
User Object Class inetOrgPerson
User Object Filter (objectClass=inetOrgPerson)
User Name Attribute uid
User Name RDN Attribute uid
User First Name Attribute givenName
User Last Name Attribute sn
User Display Name Attribute cndisplayName
User Email Attribute mail
User Password Attribute userPassword,但不读取哈希
User Unique ID Attribute entryUUID

User DN:

1
ou=people

8.3 Group Schema

Jira 字段 LDAP 属性
Group Object Class groupOfNames
Group Object Filter (objectClass=groupOfNames)
Group Name Attribute cn
Group Description Attribute description
Group Member Attribute member
Use DN in Member Attribute

Group DN:

1
ou=groups

8.4 过滤允许用户

LDAP User Object Filter:

1
(&(objectClass=inetOrgPerson)(memberOf=cn=jira-users,ou=groups,dc=example,dc=com))

OpenLDAP 如果使用 memberOf,需确认 MemberOf Overlay 已启用。

8.5 同步

先设置较长周期并手工同步:

  1. Test Settings;
  2. Save and Test;
  3. Synchronize;
  4. 检查用户和组;
  5. 检查 Application Access;
  6. 再配置定时同步。

不要把 LDAP 大组直接映射为 Jira 管理员。

九、配置 Jira 信任 LDAP CA

Jira 运行在 Java 21,需要将企业 CA 导入 Java TrustStore,或者使用独立 TrustStore。

推荐独立 TrustStore:

1
2
3
4
5
6
7
8
9
10
11
12
mkdir -p /etc/jira

JIRA_TRUSTSTORE_PASSWORD="$(openssl rand -base64 32 | tr -d '\n')"

keytool \
-importcert \
-noprompt \
-alias company-root-ca \
-file company-root-ca.crt \
-keystore /etc/jira/jira-truststore.p12 \
-storetype PKCS12 \
-storepass "${JIRA_TRUSTSTORE_PASSWORD}"
1
2
chown root:jira /etc/jira/jira-truststore.p12
chmod 0640 /etc/jira/jira-truststore.p12

/opt/atlassian/jira/bin/setenv.sh 增加:

1
2
3
4
JVM_SUPPORT_RECOMMENDED_ARGS="${JVM_SUPPORT_RECOMMENDED_ARGS} \
-Djavax.net.ssl.trustStore=/etc/jira/jira-truststore.p12 \
-Djavax.net.ssl.trustStoreType=PKCS12 \
-Djavax.net.ssl.trustStorePassword=替换为TrustStore密码"

密码应由 systemd Credential 或受限环境文件注入,不要长期明文写入脚本。

重启:

1
systemctl restart jira

十、为什么 Jira 不直接配置 CAS

Jira Data Center 原生 SSO 支持:

1
2
3
SAML 2.0
OpenID Connect
Crowd Delegation

它不提供原生 CAS Protocol Client。

不推荐:

  • 修改 web.xml 增加 CAS Filter;
  • 替换 Jira 捆绑 Tomcat;
  • 向 Jira Classpath 手工复制 CAS Client JAR;
  • 使用多年无人维护的插件;
  • 每次升级后手工重做侵入式修改。

这些做法会导致:

  • 升级覆盖;
  • 官方不支持;
  • 登录链路不可预测;
  • 安全修复困难;
  • 集群节点不一致。

推荐:

1
2
CAS 作为 SAML IdP
Jira Data Center 作为 SAML SP

十一、为 CAS 开启 SAML IdP

CAS Overlay 增加:

1
2
3
dependencies {
implementation "org.apereo.cas:cas-server-support-saml-idp"
}

重新构建:

1
./gradlew clean build -x test --no-daemon

配置 CAS IdP Entity ID、签名证书、Metadata 和属性释放。示例方向:

1
2
cas.authn.saml-idp.core.entity-id=https://sso.example.com/cas/idp
cas.authn.saml-idp.metadata.file-system.location=file:/etc/cas/saml

CAS SAML IdP 使用 OpenLDAP 认证,并释放:

1
2
3
4
5
6
uid
mail
cn
givenName
sn
memberOf

十二、在 Jira 配置 SAML SSO

Jira Data Center 中进入:

1
2
3
4
Administration
-> System
-> Authentication methods / SSO
-> Add SAML configuration

菜单名称可能随 Jira 11.3 Patch 和 SSO App 版本变化。

Jira 界面会显示:

1
2
3
SP Entity ID
Assertion Consumer Service URL
SP Metadata URL

将 Jira SP Metadata 注册到 CAS。

CAS SamlRegisteredService 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"@class": "org.apereo.cas.support.saml.services.SamlRegisteredService",
"serviceId": "https://jira.example.com",
"name": "Jira Data Center",
"id": 40000001,
"evaluationOrder": 10,
"metadataLocation": "替换为Jira界面显示的SP Metadata URL",
"attributeReleasePolicy": {
"@class": "org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy",
"allowedAttributes": [
"uid",
"mail",
"cn",
"givenName",
"sn",
"memberOf"
]
}
}

Jira SAML 配置:

项目 建议
IdP Entity ID CAS SAML IdP Entity ID
IdP SSO URL CAS SAML2 SSO Endpoint
IdP Certificate CAS SAML 签名证书
Username Mapping uid 或稳定 NameID
Email mail
Display Name cn
JIT Provisioning 使用 LDAP 时建议关闭
Remember User Login 按安全策略配置

12.1 LDAP 先同步,SAML 只登录

推荐:

1
2
3
Jira LDAP Directory 负责用户和组
CAS SAML 只负责认证
关闭 SAML JIT 自动创建用户

否则可能出现 LDAP 用户和 SAML JIT 用户重复。

12.2 NameID

推荐使用:

1
uid 或 employeeId

必须满足:

  • 唯一;
  • 稳定;
  • 不允许用户自行修改;
  • 与 Jira LDAP 用户名完全一致。

12.3 回退登录

在强制 SSO 前:

  • 保留本地 Jira 管理员;
  • 确认当前版本的 auth_fallback 回退 URL;
  • 将回退地址记录在密码库;
  • 仅允许管理网访问;
  • 演练 CAS 不可用时登录。

常见回退形式:

1
https://jira.example.com/login.jsp?auth_fallback

具体参数应以当前 Atlassian SSO 文档和 Jira 页面提示为准。

十三、CAS 直连插件备选路线

若组织明确要求使用 CAS Protocol,而不是 CAS SAML IdP,可在 Atlassian Marketplace 寻找 Data Center Approved CAS SSO App。

上线前必须确认:

  • 支持 Jira Data Center 11.3;
  • 支持 Java 21;
  • 支持集群;
  • 支持 Single Logout;
  • 支持属性映射;
  • 有持续维护和安全公告;
  • 有厂商 SLA;
  • 不修改 Jira 核心文件;
  • 升级可回滚。

第三方插件路线不属于 Atlassian 原生 CAS 支持。

十四、权限与用户组

LDAP/CAS 只解决认证和用户来源。Jira 权限由:

1
2
3
4
5
6
7
Application Access
Jira Groups
Global Permissions
Project Roles
Permission Scheme
Issue Security Scheme
Workflow Conditions

控制。

推荐 LDAP 组:

1
2
3
4
jira-users
jira-software-users
jira-servicemanagement-users
jira-auditors

不要把 LDAP jira-admins 自动映射为 Jira System Administrator,除非经过严格审批和审计。

十五、安全加固

  • HTTPS;
  • LDAP 使用 LDAPS;
  • SAML Assertion 签名;
  • NameID 稳定;
  • 保留 Break-Glass;
  • 禁用公共注册;
  • API 使用 PAT/OAuth,不使用人员密码;
  • 管理员启用 MFA;
  • 附件目录不可执行;
  • Marketplace App 最小化;
  • 定期扫描过期管理员和应用访问。

CAS SSO 只处理 Web 登录,REST API、Automation、邮件处理和服务账号仍需要专门的 Token/账号策略。

十六、性能调优

16.1 JVM

从 4~8 GB Heap 起步,通过 GC 和负载调优:

1
2
3
4
JIRA_PID="$(cat /var/atlassian/application-data/jira/catalina.pid)"

jcmd "${JIRA_PID}" GC.heap_info
jcmd "${JIRA_PID}" Thread.print

监控:

  • Full GC;
  • GC Pause;
  • Old Gen;
  • Thread;
  • Heap Dump;
  • CPU;
  • Load。

16.2 PostgreSQL

重点:

  • 数据库延迟;
  • 连接池;
  • 慢 SQL;
  • Autovacuum;
  • 磁盘 I/O;
  • max_connections
  • 备份和 WAL。

不要盲目增大 Jira DB Pool。连接多不等于数据库更快。

16.3 LDAP

  • 精确 Base DN;
  • 用户组过滤;
  • 索引 uidmailmemberOf
  • 合理同步周期;
  • 监控 Directory Sync;
  • 大组和嵌套组谨慎使用。

16.4 Jira 业务治理

Jira 性能常被配置复杂度拖慢:

  • 过多 Custom Field;
  • 全局 Context;
  • 大量 Workflow;
  • 复杂 JQL;
  • Dashboard Gadget;
  • 高负载 Automation;
  • Marketplace App;
  • 超大 Group。

这类问题不是加 JVM Heap 就能根治。

十七、备份

必须备份:

1
2
3
4
5
6
7
8
9
10
PostgreSQL
Jira Home
附件
Lucene Index(可重建但恢复更快)
安装目录自定义配置
server.xml
setenv.sh
证书与 TrustStore
LDAP/SAML 配置记录
License

17.1 数据库

1
2
3
4
5
6
mkdir -p /backup/jira

sudo -u postgres pg_dump \
-Fc \
jiradb \
> "/backup/jira/jiradb-$(date +%F-%H%M%S).dump"

17.2 Jira Home

维护窗口停止 Jira:

1
systemctl stop jira
1
2
3
4
tar --xattrs --acls \
-czf "/backup/jira/jira-home-$(date +%F-%H%M%S).tar.gz" \
-C /var/atlassian/application-data \
jira
1
systemctl start jira

配置:

1
2
3
4
5
6
7
tar --xattrs --acls \
-czf "/backup/jira/jira-config-$(date +%F-%H%M%S).tar.gz" \
/opt/atlassian/jira/conf/server.xml \
/opt/atlassian/jira/bin/setenv.sh \
/etc/systemd/system/jira.service \
/etc/nginx/conf.d/jira.example.com.conf \
/etc/jira

十八、升级

升级前:

  1. 阅读 Jira 11.x Upgrade Notes;
  2. 验证 Java、PostgreSQL 和 App 兼容;
  3. 备份数据库、Home 和配置;
  4. 在测试环境恢复生产备份;
  5. 验证 LDAP/SAML;
  6. 准备旧版本软链接回滚。

新版本解压到新目录:

1
2
/opt/atlassian/jira-11.3.a
/opt/atlassian/jira-11.3.b

不要覆盖旧安装目录。迁移配置时不要直接复制整个旧 web.xml 或全部 Tomcat 配置,应按官方 Upgrade Guide 合并必要修改。

升级后验证:

1
2
3
4
5
6
7
8
9
10
本地管理员
LDAP 登录/同步
CAS SAML 登录
Issue 创建
附件
搜索和索引
Automation
邮件
Marketplace App
REST API

十九、常见故障

19.1 Jira 启动失败

1
2
3
4
5
systemctl status jira -l
journalctl -u jira -n 300 --no-pager

tail -f \
/var/atlassian/application-data/jira/log/atlassian-jira.log

检查 Java 21、Home 权限、数据库、PID、端口和 License。

19.2 LDAP SSL 错误

1
2
3
4
openssl s_client \
-connect ldap.example.com:636 \
-servername ldap.example.com \
-showcerts
1
2
3
keytool -list \
-keystore /etc/jira/jira-truststore.p12 \
-storetype PKCS12

检查 SAN、CA、TrustStore 密码和系统时间。

19.3 LDAP 用户存在但 Jira 搜不到

检查:

  • User DN;
  • Group DN;
  • Object Class;
  • uid
  • Filter;
  • MemberOf Overlay;
  • Reader ACL;
  • Directory 顺序。

19.4 SAML 登录后用户不存在

原因通常是:

  • LDAP 尚未同步;
  • NameID 与 uid 不一致;
  • JIT 关闭但用户不存在;
  • Directory 不可用;
  • 用户没有 Application Access;
  • 用户被禁用。

19.5 SAML 登录循环

检查:

1
2
3
4
5
6
7
8
9
Jira Base URL
Nginx Forwarded Header
Tomcat proxyName/proxyPort/scheme
CAS Entity ID
ACS
Audience
Recipient
Cookie
时间同步

19.6 用户登录成功但没有项目权限

SSO 成功不等于授权成功。检查:

1
2
3
4
5
Application Access
Group
Project Role
Permission Scheme
Issue Security

19.7 修改 server.xml 后升级丢失

Jira 安装目录是版本目录,升级不会自动合并手工修改。必须通过配置清单和差异工具迁移,而不是依赖记忆。

二十、生产检查清单

  • 使用 Jira Data Center License;
  • Java 21;
  • PostgreSQL 版本在支持矩阵内;
  • Jira Home 与安装目录分离;
  • HTTPS 与 Nginx 代理参数正确;
  • LDAP 使用专用 Reader 和 LDAPS;
  • LDAP 用户和组过滤已验证;
  • CAS 通过 SAML IdP 接入;
  • 未侵入修改 Jira 以强接 CAS Filter;
  • SAML JIT 与 LDAP 同步策略不冲突;
  • NameID 与 LDAP uid 一致;
  • 保留本地回退管理员;
  • Application Access 和项目权限单独治理;
  • 数据库、Home、附件和配置已备份;
  • 已演练 LDAP/CAS 故障;
  • Marketplace App 已验证 Jira 11.3/Java 21 兼容。

二十一、总结

推荐链路:

1
2
3
OpenLDAP:身份和用户组
CAS:LDAP 认证 + SAML IdP
Jira Data Center:LDAP Directory + SAML SP

核心原则:

  1. Jira 原生支持 LDAP,但不原生支持 CAS Protocol;
  2. 使用 CAS SAML IdP 对接 Jira Data Center 原生 SSO;
  3. LDAP 负责用户生命周期,SAML 负责登录;
  4. 关闭或谨慎使用 SAML JIT,避免重复用户;
  5. NameID 必须与 LDAP 用户名稳定一致;
  6. SSO 只解决认证,Jira 权限仍由 Application Access、Group、Role 和 Scheme 控制;
  7. 保留本地回退管理员并演练故障登录;
  8. 升级必须同时验证 Java、数据库、LDAP、SAML 和 Marketplace App。

把 CAS 接入 Jira 的正确做法,不是在 Tomcat 里塞一个过滤器“能跳转就算成功”,而是利用 Jira 官方 SAML 边界,把身份、登录和应用权限分层管理。

参考资料


Rocky Linux 10 搭建 Jira Data Center 并集成 OpenLDAP 与 CAS 单点登录
https://allendericdalexander.github.io/2026/08/01/devops/linux/rocky/rocky-linux-10-jira-ldap-cas/
作者
AtLuoFu
发布于
2026年8月1日
许可协议