What is FIPS?
>From Wikipedia [1]: The Federal Information Processing Standard (FIPS)
Publication 140-2, (FIPS PUB 140-2), is a U.S. government computer
security standard used to approve cryptographic modules. The title is
Security Requirements for Cryptographic Modules.

What are Implications of FIPS 140-2 Support for Foreman, Katello, and
Smart-Proxy?
Linux system, or rather an SSL library in FIPS-compatible mode will
only have a set of ciphers and hash functions compatible with FIPS.
[2] contains the list of approved cryptographic functions, Oracle
graciously compiled the list of not approved ones, which is more
useful and can be found at [3].


OpenSSL in FIPS mode
My understanding is that only OpenSSL versions 1.0.1 and 1.0.2 have
FIPS 140-2 validated cryptographic modules. OpenSSL raises ABRT signal
when it receives a call to one of the unapproved ciphers/functions.


Foreman in FIPS mode
I haven’t looked at pulp, candlepin, qpid, goferd, etc, and at point
don’t know how and if these can be made to work in FIPS mode. All
tests I’ve done so far were against Rails 5.0, Considering the number
of dependencies, we will need to limit FIPS support to just one
version of Rails.

Rails and other (ruby) dependencies.
MD5 is used (hard-coded) in a few places in Rails, at this point I’m
quite certain that its use is constrained to various built-in caches.
I had to disable *all* Rails caches to be able to run Foreman in FIPS
mode. Additionally, strong ETAG’s cannot be used, I’m not sure if they
are used, or there are plans for them.
Spring uses MD5 to generate application ID, but will use one in
SPRING_APPLICATION_ID environment variable if it’s available.
Gravatar uses MD5 hashes in their urls, doesn’t look like other hashes
are supported.
I think apipie cache uses MD5, but I will need to verify this.

Foreman
app/services/password_crypt uses MD5 for grub2 passwords, which will
need to be switched to SHA512. MD5 will need to be removed from the
list of hash functions
SshKey#generate_fingerprint, call to SSHKey.fingerprint uses MD5

A note: with caching disabled, and issues above fixed, I was able to
get Foreman suite of tests to pass, and get Foreman to start.

Smart-Proxy
Smart-Proxy codebase appears to be compatible with FIPS (ran and
passed tests ok without any changes), but there are issues with
external depdencies.

DHCPD uses MD5-based omapi shared secret. DHCPD shared secret with
bind is also md5-based.
BIND when used with dhcpd uses MD5 hashes stored in TXT as host id.
Puppet needs to be run in FIPS mode (FIPS-compatible hash function
needs to be configured). I assume this covers all of puppet, including
mcollective, puppet run, puppetca.
BMC/IPMI authentication can use MD5 or lower based hashes, older
clients may not have newer hash functions.
Salt appears to use MD5 hashes by default, individual nodes must be
configured to use other hash_type

Any 3rd party SSL certificates that may need to be verified or decoded
by either Foreman or Smart-Proxy must be generated using
FIPS-compatible algorithms/hash functions.

How we can reach FIPS compatibility
The easiest first step would be to replace offending cryptographic and
hash functions in Foreman, and in Smart-Proxy case, 3rd party
configuration files with FIPS-compatible ones. Additionally, any new
code changes that employ MD5 or other non approved functions shouldn’t
be accepted.
The next step would be to create a CI job that will continuously
execute the the full suite of tests on a VM with FIPS mode enabled.
GDB configured with Ruby’s project .gdbinit [4] and a tiny batch [5]
of commands can be used to report on FIPS-related failures.
Considering the amount of dependencies Foreman and Smart-Proxy have, I
think would be useful to have all CI environments switched to run in
FIPS mode: this should increase the probability of discovering of new
FIPS-related issues before our users.
Lastly, a FIPS-compatible caching solution for Rails needs to be
found, if none exist, an existing one needs to be modified to support
FIPS.


Any feedback would be appreciated,
-d

[1] Wikipedia article on FIPS 140-2, https://en.wikipedia.org/wiki/
FIPS_140-2
[2] Approved Security Functions for FIPS 140-2,
https://csrc.nist.gov/csrc/media/publications/fips/140/2/final/documents/
fips1402annexa.pdf
[3] List of algorithms not approved for FIPS 140-2,
https://docs.oracle.com/cd/E36784_01/html/E54953/fips-notok-1.html
[4] Ruby project’s gdb helper functions,
https://github.com/ruby/ruby/blob/trunk/.gdbinit
[5] Catching SIGABRTs with gdb and ruby-specific .gdbinit,
https://gist.github.com/witlessbird/904fefb0031c2eda96da61bd19424c86

-- 
You received this message because you are subscribed to the Google Groups 
"foreman-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to foreman-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to