Skip to content

Commit cb956df

Browse files
committed
fixed merge failures
2 parents 1696ac7 + 8532ee6 commit cb956df

File tree

1 file changed

+52
-36
lines changed

1 file changed

+52
-36
lines changed

modules/ROOT/pages/security/ssl-fips-compatibility.adoc

Lines changed: 52 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,24 @@
44
:description: How to configure Neo4j to use FIPS compatible SSL encryption.
55
:keywords: ssl, tls, authentication, encryption, encrypted, security, fips, fips 140, fips 140-2, nist, hipaa
66

7-
Federal Information Processing Standards (FIPS) 140 is a U.S. government standard established by the National Institute of Standards and Technology (NIST) which is used to accredit cryptographic modules such as those used in TLS network encryption. While FIPS 140 compliance is primarily required for federal agencies and their contractors, it also is used in the healthcare sector under regulations like the Health Insurance Portability and Accountability Act (HIPAA) to protect patient data.
7+
Federal Information Processing Standards (FIPS) 140 is a U.S. government standard established by the National Institute of Standards and Technology (NIST) which is used to accredit cryptographic modules such as those used in TLS network encryption.
8+
While FIPS 140 compliance is primarily required for federal agencies and their contractors, it also is used in the healthcare sector under regulations like the Health Insurance Portability and Accountability Act (HIPAA) to protect patient data.
89

910
This is a guide to help configure Neo4j to use TLS / SSL encryption in a FIPS-compatible way.
1011
It is supplementary to the xref:security/ssl-framework.adoc[] documentation, as many of the configuration processes and requirements are the same.
1112

1213

14+
[[ssl-fips-prerequisites]]
1315
== Prerequisites
1416

1517
* Verify that the machine running Neo4j has FIPS-compatible hardware and operating system.
1618
Only xref:installation/requirements.adoc#deployment-requirements-software[Linux operating systems] are supported for Neo4j FIPS compatibility at this time.
17-
* Neo4j Enterprise 5.23.0 or later.
19+
* Use Neo4j Enterprise 5.23.0 or later.
1820
* Install and configure a non-native authentication provider, for example LDAP or SSO. See xref:authentication-authorization/index.adoc[].
1921

2022

21-
== Enable FIPS SSL Provider (Docker)
23+
[[fips-ssl-provider-docker]]
24+
== Enable FIPS SSL provider (Docker)
2225

2326
The Neo4j RedHat UBI9 Docker image comes with the SSL provider and dependencies pre-installed, but it is not enabled by default.
2427

@@ -42,37 +45,39 @@ docker run -it --rm \
4245
neo4j:{neo4j-version-exact}-enterprise-ubi9
4346
----
4447

48+
[[fips-ssl-provider]]
4549
== Enable FIPS SSL provider
4650

4751
[IMPORTANT]
4852
====
4953
Skip this section if using Neo4j in Docker.
5054
====
5155

52-
The secure networking in Neo4j is provided through the Netty library, which supports both the native JDK SSL provider as well as Netty-supported OpenSSL derivatives.
53-
Specifically Netty's "Forked Tomcat Native" library called https://github.com/netty/netty-tcnative[netty-tcnative].
56+
The secure networking in Neo4j is provided through the Netty library, which supports both the native JDK SSL provider and Netty-supported OpenSSL derivatives.
57+
Specifically Netty's _Forked Tomcat Native_ library called https://github.com/netty/netty-tcnative[netty-tcnative].
5458

55-
The `netty-tcnative` library is provided in several variants, but
56-
to be FIPS compatible the dynamically linked version of `netty-tcnative` must be used, alongside a FIPS compatible installation of OpenSSL.
57-
This dynamically linked library requires that the following dependencies are installedfootnote:[https://netty.io/wiki/forked-tomcat-native.html]:
59+
The `netty-tcnative` library is provided in several variants.
60+
However, to achieve FIPS compliance, you must use the dynamically linked version of `netty-tcnative` alongside a FIPS-compatible installation of OpenSSL.
61+
62+
The dynamically linked library requires the following dependencies to be installedfootnote:[https://netty.io/wiki/forked-tomcat-native.html]:
5863

5964
* Apache Portable Runtime Library
6065
* A FIPS certified version of OpenSSL, with a FIPS provider installed and set as default.
6166

62-
Refer to https://netty.io/wiki/forked-tomcat-native.html for more information.
67+
Refer to https://netty.io/wiki/forked-tomcat-native.html/[Forked Tomcat Native] for more information.
6368

6469

6570
[NOTE]
6671
====
67-
Netty provide a convenient pre-build, statically linked version of `netty-tcnative` using BoringSSL, but this is not FIPS certifiedfootnote:[https://boringssl.googlesource.com/boringssl/+/master/crypto/fipsmodule/FIPS.md].
72+
Netty provides a convenient pre-build, statically linked version of `netty-tcnative` using BoringSSL, but this is not FIPS certifiedfootnote:[https://boringssl.googlesource.com/boringssl/+/master/crypto/fipsmodule/FIPS.md].
6873
6974
By using the dynamic `netty-tcnative` library variant combined with a FIPS certified OpenSSL installation, Neo4j's cryptographic operations are delegated by `netty-tcnative` to OpenSSL, transitively giving FIPS compatibility.
7075
====
7176

7277
[[install-apr]]
7378
=== Install Apache portable runtime library
7479

75-
The simplest way to install https://apr.apache.org[Apache Portable Runtime Library] is to use the operating system's package manager.
80+
To install https://apr.apache.org[Apache Portable Runtime Library], use the operating system's package manager.
7681

7782
In Debian/Ubuntu this package is usually called `libapr1`
7883
[source, console, subs="attributes"]
@@ -81,37 +86,38 @@ In Debian/Ubuntu this package is usually called `libapr1`
8186
apt install -y libapr1
8287
----
8388

84-
In RedHat Enterprise Linux the package is usually called `apr`:
89+
In RedHat Enterprise Linux, the package is usually called `apr`:
8590

8691
[source, console, subs="attributes"]
8792
.Install Apache Portable Runtime Library in RedHat
8893
----
8994
dnf install -y apr
9095
----
9196

97+
[[install-openssl]]
9298
=== Install OpenSSL
9399

94100
Instructions on how to build and install a FIPS-compatible OpenSSL are out of scope for this document. Installation steps can differ depending on operating system, and other security requirements you might have for OpenSSL.
95101

96102
In general:
97103

98-
* A list of FIPS certified OpenSSL versions can be found at https://openssl-library.org/source/
104+
* For a list of FIPS certified OpenSSL versions, see https://openssl-library.org/source/[].
99105
* A FIPS provider must be installed into OpenSSL.
100106
* OpenSSL must be configured to use the FIPS provider by default.
101-
+
102-
See: https://docs.openssl.org/master/man7/fips_module/
103107

104108

105-
=== Install correct `netty-tcnative` library
106109

107-
Since Neo4j 5.23.0, builds of `netty-tcnative` dynamic library are provided in
108-
the Neo4j `lib` directory under their own subfolder called `netty-tcnative`.
110+
[[install-netty-tcnative-lib]]
111+
=== Install the correct `netty-tcnative` library
112+
113+
Since Neo4j 5.23.0, builds of `netty-tcnative` dynamic library are provided in the Neo4j `lib` directory under their own subfolder called `netty-tcnative`.
109114

110115
To install the `netty-tcnative` dynamic library:
111116

112117
. Locate the Neo4j `lib` directory.
113118
+
114-
The location of the `lib` directory is different depending on the method used to install Neo4j. Check the xref:configuration/file-locations.adoc#neo4j-lib[file locations] documentation for the correct location.
119+
The location of the `lib` directory is different depending on the method used to install Neo4j.
120+
Check the xref:configuration/file-locations.adoc#neo4j-lib[file locations] documentation for the correct location.
115121
+
116122
This location will be referred to as _<NEO4J_LIB>_.
117123
. Make sure there are no `netty-tcnative-boringssl` libraries present in the _<NEO4J_LIB>_ folder.
@@ -127,7 +133,7 @@ find <NEO4J_LIB> -name "netty-tcnative-boringssl*.jar" -delete
127133
----
128134
ls -l <NEO4J_LIB>/netty-tcnative
129135
----
130-
There are linux and fedora linux variants available, compiled for both x86_64 and ARM 64 architectures.
136+
There are Linux and Fedora Linux variants available, compiled for both x86_64 and ARM 64 architectures.
131137
Select the one matching the local machine's operating system and architecture.
132138
+
133139
. Verify the dependencies are correctly installed using https://www.man7.org/linux/man-pages/man1/ldd.1.html[`ldd`]:
@@ -141,7 +147,7 @@ rm -rf /tmp/META-INF
141147
----
142148
+
143149
[source, console]
144-
.Verify fedora variant of netty-tcnative dependencies are installed
150+
.Verify Fedora variant of netty-tcnative dependencies are installed
145151
----
146152
unzip -d /tmp <NEO4J_LIB>/netty-tcnative/netty-tcnative-*-linux-$(arch)-fedora.jar
147153
ldd /tmp/META-INF/native/libnetty_tcnative_linux_$(arch).so
@@ -163,30 +169,33 @@ In case of this error, you will get a message like:
163169
----
164170
====
165171

166-
172+
[[generate-ssl-cert-private-key]]
167173
== Generate SSL certificate and private key
168174

169-
Neo4j SSL encryption requires a xref:security/ssl-framework.adoc#term-ssl-certificate[certificate] in the xref:security/ssl-framework.adoc#term-ssl-x509[X.509] standard, encoded in PEM format.
170-
and a private key in xref:security/ssl-framework.adoc#term-ssl-pkcs8[PKCS #8] format, also PEM encoded.
171-
*For FIPS compatibility, the private key must be secured with a password*.
175+
Neo4j SSL encryption requires a xref:security/ssl-framework.adoc#term-ssl-certificate[certificate] in the xref:security/ssl-framework.adoc#term-ssl-x509[X.509] standard and a private key in xref:security/ssl-framework.adoc#term-ssl-pkcs8[PKCS #8] format, both encoded in PEM format.
176+
177+
[IMPORTANT]
178+
====
179+
For FIPS compatibility, the private key must be secured with a password.
180+
====
172181

173182
Refer to the xref:security/ssl-framework.adoc#ssl-certificates[SSL certificate and key instructions] for more information.
174183

175184

185+
[[configure-neo4j-ssl-encryption]]
176186
== Configure Neo4j to use SSL encryption
177187

178-
179-
SSL configuration is described in detail at xref:security/ssl-framework.adoc#ssl-configuration[SSL framework configuration].
188+
SSL configuration is described in detail in xref:security/ssl-framework.adoc#ssl-configuration[SSL framework configuration].
180189

181190
This section describes configuration that must be done *in addition to* standard non-FIPS compliant SSL configuration.
182191

183-
192+
[[bolt-ssl-fips]]
184193
=== Bolt
185194

186195
. Set `xref:configuration/configuration-settings.adoc#config_dbms.netty.ssl.provider[dbms.netty.ssl.provider]=OPENSSL`
187196
. Set `xref:configuration/configuration-settings.adoc#config_server.bolt.tls_level[server.bolt.tls_level]=REQUIRED`
188-
. Follow instructions to xref:security/ssl-framework.adoc#ssl-bolt-config[Configure SSL over bolt].
189-
. Set additional bolt configurations:
197+
. Follow instructions on how to xref:security/ssl-framework.adoc#ssl-bolt-config[Configure SSL over Bolt].
198+
. Set additional Bolt configurations:
190199
+
191200
[source, properties]
192201
----
@@ -195,14 +204,16 @@ dbms.ssl.policy.bolt.tls_level=REQUIRED
195204
dbms.ssl.policy.bolt.tls_versions=TLSv1.2,TLSv1.3
196205
dbms.ssl.policy.bolt.ciphers=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_AES_128_CCM_8_SHA256,TLS_AES_128_CCM_SHA256
197206
----
198-
. Follow the instructions in xref:security/ssl-framework.adoc#ssl-config-private-key[SSL Framework/Using encrypted private key] to configure `dbms.ssl.policy.bolt.private_key_password` to dynamically read the password from an encrypted password file. The password must NOT be set in plain text.
207+
. Follow the instructions in xref:security/ssl-framework.adoc#ssl-config-private-key[SSL Framework -> Using encrypted private key] to configure `dbms.ssl.policy.bolt.private_key_password` to dynamically read the password from an encrypted password file.
208+
The password must *not* be set in plain text.
199209

200210

211+
[[https-ssl-fips]]
201212
=== HTTPS
202213

203214
This section is only applicable if HTTPS is enabled.
204215

205-
. Follow instructions to xref:security/ssl-framework.adoc#ssl-https-config[Configure SSL over HTTPS].
216+
. Follow instructions on how to xref:security/ssl-framework.adoc#ssl-https-config[Configure SSL over HTTPS].
206217
+
207218
. Set additional HTTPS configurations:
208219
+
@@ -213,8 +224,9 @@ dbms.ssl.policy.https.tls_level=REQUIRED
213224
dbms.ssl.policy.https.tls_versions=TLSv1.2,TLSv1.3
214225
dbms.ssl.policy.https.ciphers=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_AES_128_CCM_8_SHA256,TLS_AES_128_CCM_SHA256
215226
----
216-
. Follow the instructions in xref:security/ssl-framework.adoc#ssl-config-private-key[SSL Framework/Using encrypted private key] to configure `dbms.ssl.policy.https.private_key_password` to dynamically read the password from an encrypted password file. The password must NOT be set in plain text.
227+
. Follow the instructions in xref:security/ssl-framework.adoc#ssl-config-private-key[SSL Framework -> Using encrypted private key] to configure `dbms.ssl.policy.https.private_key_password` to dynamically read the password from an encrypted password file. The password must NOT be set in plain text.
217228

229+
[[intra-cluster-encryption-ssl-fips]]
218230
=== Intra-cluster encryption
219231

220232
For FIPS compatbility, intra-cluster encryption must be enabled if you are running a Neo4j cluster.
@@ -230,14 +242,16 @@ dbms.ssl.policy.cluster.client_auth=REQUIRED
230242
dbms.ssl.policy.cluster.tls_versions=TLSv1.2,TLSv1.3
231243
dbms.ssl.policy.cluster.ciphers=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_AES_128_CCM_8_SHA256,TLS_AES_128_CCM_SHA256
232244
----
233-
. Follow the instructions in xref:security/ssl-framework.adoc#ssl-config-private-key[SSL Framework/Using encrypted private key] to configure `dbms.ssl.policy.cluster.private_key_password` to dynamically read the password from an encrypted password file. The password must NOT be set in plain text.
245+
. Follow the instructions in xref:security/ssl-framework.adoc#ssl-config-private-key[SSL Framework -> Using encrypted private key] to configure `dbms.ssl.policy.cluster.private_key_password` to dynamically read the password from an encrypted password file.
246+
The password must *not* be set in plain text.
234247

235248

249+
[[backup-ssl-fips]]
236250
=== Backup
237251

238252
This section is applicable on instances or cluster members used for taking backups.
239253

240-
. Follow instructions to xref:security/ssl-framework.adoc#ssl-backup-config[configure SSL for backup communication].
254+
. Follow instructions on how to xref:security/ssl-framework.adoc#ssl-backup-config[Configure SSL for backup communication].
241255
. Set additional backup configurations:
242256
+
243257
[source, properties]
@@ -248,4 +262,6 @@ dbms.ssl.policy.backup.trust_all=false
248262
dbms.ssl.policy.backup.tls_versions=TLSv1.2,TLSv1.3
249263
dbms.ssl.policy.backup.ciphers=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_AES_128_CCM_8_SHA256,TLS_AES_128_CCM_SHA256
250264
----
251-
. Follow the instructions in xref:security/ssl-framework.adoc#ssl-config-private-key[SSL Framework/Using encrypted private key] to configure `dbms.ssl.policy.backup.private_key_password` to dynamically read the password from an encrypted password file. The password must NOT be set in plain text.
265+
. Follow the instructions in xref:security/ssl-framework.adoc#ssl-config-private-key[SSL Framework -> Using encrypted private key] to configure `dbms.ssl.policy.backup.private_key_password` to dynamically read the password from an encrypted password file.
266+
The password must *not* be set in plain text.
267+

0 commit comments

Comments
 (0)