feat: add new OSes and deprecate old ones

add:
- Debian 11
- RockyLinux 8

remove:
- OpenSUSE Leap 15.2
- Old minor versions of CentOS 7.x
- Old minor versions of CentOS 8.x
This commit is contained in:
Stéphane Lesimple 2021-12-20 13:05:27 +00:00 committed by Stéphane Lesimple
parent aaaa173764
commit a68ccb3f8c
15 changed files with 84 additions and 47 deletions

View file

@ -20,7 +20,7 @@ jobs:
name: Long name: Long
strategy: strategy:
matrix: matrix:
platform: ['centos7@centos:7.9.2009', 'centos8@centos:8.3.2011', debian9, debian10, debian11, 'opensuse15@opensuse/leap:15.3', ubuntu1604, ubuntu1804, ubuntu2004] platform: [rockylinux8, debian10, 'opensuse15@opensuse/leap:15.3', ubuntu2004]
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: contains(github.event.pull_request.labels.*.name, 'tests:long') if: contains(github.event.pull_request.labels.*.name, 'tests:long')
steps: steps:
@ -34,7 +34,7 @@ jobs:
name: Full name: Full
strategy: strategy:
matrix: matrix:
platform: ['centos7@centos:7.7.1908', 'centos7@centos:7.8.2003', 'centos7@centos:7.9.2009', 'centos8@centos:8.1.1911', 'centos8@centos:8.2.2004', 'centos8@centos:8.3.2011', debian9, debian10, debian11, 'opensuse15@opensuse/leap:15.2', 'opensuse15@opensuse/leap:15.3', ubuntu1604, ubuntu1804, ubuntu2004] platform: [centos7, centos8, rockylinux8, debian9, debian10, debian11, 'opensuse15@opensuse/leap:15.3', ubuntu1604, ubuntu1804, ubuntu2004]
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: contains(github.event.pull_request.labels.*.name, 'tests:full') if: contains(github.event.pull_request.labels.*.name, 'tests:full')
steps: steps:

View file

@ -72,10 +72,11 @@ Also don't forget to customize your `bastion.conf` file, which can be found in `
Linux distros below are tested with each release, but as this is a security product, you are **warmly** advised to run it on the latest up-to-date stable version of your favorite OS: Linux distros below are tested with each release, but as this is a security product, you are **warmly** advised to run it on the latest up-to-date stable version of your favorite OS:
- Debian 10 (Buster), 9 (Stretch) - Debian 11 (Bullseye), Debian 10 (Buster), 9 (Stretch)
- RHEL/CentOS 8.x (8.3.2011, 8.2.2004, 8.1.1911), 7.x (7.9.2009, 7.8.2003, 7.7.1908) - RHEL/CentOS 8.x, 7.x
- RockyLinux 8.x
- Ubuntu LTS 20.04, 18.04, 16.04 - Ubuntu LTS 20.04, 18.04, 16.04
- OpenSUSE Leap 15.3\*, 15.2\* - OpenSUSE Leap 15.3\*
\*: Note that these versions have no out-of-the-box MFA support, as they lack packaged versions of `pamtester`, `pam-google-authenticator`, or both. Of course, you may compile those yourself. \*: Note that these versions have no out-of-the-box MFA support, as they lack packaged versions of `pamtester`, `pam-google-authenticator`, or both. Of course, you may compile those yourself.
Any other so-called "modern" Linux version are not tested with each release, but should work with no or minor adjustments. Any other so-called "modern" Linux version are not tested with each release, but should work with no or minor adjustments.
@ -86,7 +87,7 @@ The following OS are also tested with each release:
\*\*: Note that these have partial MFA support, due to their reduced set of available `pam` plugins. Support for either an additional password or TOTP factor can be configured, but not both at the same time. The code is actually known to work on FreeBSD/HardenedBSD 10+, but it's only regularly tested under 13.0. \*\*: Note that these have partial MFA support, due to their reduced set of available `pam` plugins. Support for either an additional password or TOTP factor can be configured, but not both at the same time. The code is actually known to work on FreeBSD/HardenedBSD 10+, but it's only regularly tested under 13.0.
Other BSD variants, namely OpenBSD 5.4+ and NetBSD 7+ partially work but are unsupported and discouraged as they have a severe limitation over the maximum number of supplementary groups, causing problems for group membership and restricted commands checks, as well as no filesystem-level ACL support and missing PAM support (hence no MFA). Other BSD variants, such as OpenBSD and NetBSD, are unsupported as they have a severe limitation over the maximum number of supplementary groups, causing problems for group membership and restricted commands checks, as well as no filesystem-level ACL support and missing PAM support (hence no MFA).
### Zero assumption on your environment ### Zero assumption on your environment

View file

@ -394,8 +394,7 @@ check_config_value 'IgnoreRHosts', 'no', 'yes';
check_config_value 'StrictModes', 'yes', 'yes'; check_config_value 'StrictModes', 'yes', 'yes';
check_config_value 'PermitRootLogin', 'yes', [qw{ no without-password forbid-password }]; check_config_value 'PermitRootLogin', 'yes', [qw{ no without-password forbid-password }];
check_config_value 'PermitEmptyPasswords', 'no', 'no'; check_config_value 'PermitEmptyPasswords', 'no', 'no';
check_config_value 'UsePrivilegeSeparation', 'yes', [qw{ yes sandbox }]; check_config_value 'PermitTunnel', 'yes', [qw{ 0 no }];
check_config_value 'PermitTunnel', 'yes', [qw{ 0 no }];
check_config_value 'AllowAgentForwarding', 'yes', 'no'; check_config_value 'AllowAgentForwarding', 'yes', 'no';
check_config_value 'AllowTcpForwarding', 'yes', 'no'; check_config_value 'AllowTcpForwarding', 'yes', 'no';

View file

@ -244,6 +244,7 @@ fi
if [ "${opt[modify-ssh-config]}" = 1 ] || [ "${opt[modify-sshd-config]}" = 1 ] ; then if [ "${opt[modify-ssh-config]}" = 1 ] || [ "${opt[modify-sshd-config]}" = 1 ] ; then
action_doing "Find which ssh/sshd config templates to install on $OS_FAMILY $LINUX_DISTRO $DISTRO_VERSION" action_doing "Find which ssh/sshd config templates to install on $OS_FAMILY $LINUX_DISTRO $DISTRO_VERSION"
short_suffix_name=$(echo "$LINUX_DISTRO$DISTRO_VERSION_MAJOR" | sed -re "s/[^a-z0-9]//") short_suffix_name=$(echo "$LINUX_DISTRO$DISTRO_VERSION_MAJOR" | sed -re "s/[^a-z0-9]//")
[ "$short_suffix_name" = "rocky8" ] && short_suffix_name=centos8
filesuffix=default filesuffix=default
if [ -e "$basedir/etc/ssh/sshd_config.$short_suffix_name" ] && [ -e "$basedir/etc/ssh/ssh_config.$short_suffix_name" ]; then if [ -e "$basedir/etc/ssh/sshd_config.$short_suffix_name" ] && [ -e "$basedir/etc/ssh/ssh_config.$short_suffix_name" ]; then
filesuffix=$short_suffix_name filesuffix=$short_suffix_name
@ -253,8 +254,10 @@ if [ "${opt[modify-ssh-config]}" = 1 ] || [ "${opt[modify-sshd-config]}" = 1 ] ;
filesuffix=debian7 filesuffix=debian7
elif [ "$DISTRO_VERSION_MAJOR" -le 16 ]; then elif [ "$DISTRO_VERSION_MAJOR" -le 16 ]; then
filesuffix=debian8 filesuffix=debian8
else elif [ "$DISTRO_VERSION_MAJOR" -le 18 ]; then
filesuffix=debian10 filesuffix=debian10
else
filesuffix=debian11
fi fi
elif echo "$DISTRO_LIKE" | grep -q -w suse; then elif echo "$DISTRO_LIKE" | grep -q -w suse; then
filesuffix=opensuse15 filesuffix=opensuse15

View file

@ -76,7 +76,7 @@ elif echo "$DISTRO_LIKE" | grep -q -w rhel; then
expect openssh-server nc bash perl-CGI perl(Test::More) passwd \ expect openssh-server nc bash perl-CGI perl(Test::More) passwd \
cracklib-dicts perl-Time-Piece perl-Time-HiRes diffutils \ cracklib-dicts perl-Time-Piece perl-Time-HiRes diffutils \
perl-Sys-Syslog pamtester google-authenticator qrencode-libs \ perl-Sys-Syslog pamtester google-authenticator qrencode-libs \
util-linux-user perl-LWP-Protocol-https" util-linux-user perl-LWP-Protocol-https findutils"
if [ "$DISTRO_VERSION_MAJOR" = 7 ]; then if [ "$DISTRO_VERSION_MAJOR" = 7 ]; then
wanted_list="$wanted_list fortune-mod coreutils" wanted_list="$wanted_list fortune-mod coreutils"
fi fi
@ -87,10 +87,14 @@ elif echo "$DISTRO_LIKE" | grep -q -w rhel; then
if [ "$opt_install" = 1 ]; then if [ "$opt_install" = 1 ]; then
if [ "$DISTRO_VERSION_MAJOR" = 8 ]; then if [ "$DISTRO_VERSION_MAJOR" = 8 ]; then
# in December 2020, they added "-Linux" to their repo name, so trying both combinations # in December 2020, they added "-Linux" to their repo name, so trying both combinations
for repo in CentOS-PowerTools CentOS-Extras CentOS-Linux-PowerTools CentOS-Linux-Extras # also try with "Rocky-" for RockyLinux
for repo in PowerTools Extras
do do
test -f /etc/yum.repos.d/$repo.repo || continue for prefix in CentOS CentOS-Linux Rocky
sed -i -e 's/enabled=.*/enabled=1/g' /etc/yum.repos.d/$repo.repo do
test -f /etc/yum.repos.d/$prefix-$repo.repo || continue
sed -i -e 's/enabled=.*/enabled=1/g' /etc/yum.repos.d/$prefix-$repo.repo
done
done done
fi fi
if command -v dnf >/dev/null; then if command -v dnf >/dev/null; then

View file

@ -26,24 +26,22 @@ We published a Puppet module to handle The Bastion configuration and prerequisit
The following Linux distros are tested with each release, but as this is a security product, you are *warmly* advised to run it on the latest up-to-date stable version of your favorite OS: The following Linux distros are tested with each release, but as this is a security product, you are *warmly* advised to run it on the latest up-to-date stable version of your favorite OS:
- Debian 10 (Buster), 9 (Stretch) - Debian 11 (Bullseye), Debian 10 (Buster), 9 (Stretch)
- RHEL/CentOS 8.x (8.3.2011, 8.2.2004, 8.1.1911), 7.x (7.9.2009, 7.8.2003, 7.7.1908) - RHEL/CentOS 8.x, 7.x
- RockyLinux 8.x
- Ubuntu LTS 20.04, 18.04, 16.04 - Ubuntu LTS 20.04, 18.04, 16.04
- OpenSUSE Leap 15.3\*, 15.2\* - OpenSUSE Leap 15.3\*
\*: Note that these versions have no out-of-the-box MFA support, as they lack packaged versions of ``pamtester``, ``pam-google-authenticator``, or both. Of course, you may compile those yourself. \*: Note that these versions have no out-of-the-box MFA support, as they lack packaged versions of ``pamtester``, ``pam-google-authenticator``, or both. Of course, you may compile those yourself.
Any other so-called `modern` Linux version are not tested with each release, but should work with no or minor adjustments. Any other so-called `modern` Linux version are not tested with each release, but should work with no or minor adjustments.
The following OS are also tested with each release: The following OS are also tested with each release:
- FreeBSD/HardenedBSD 12.1\*\* - FreeBSD/HardenedBSD 13.0\*\*
\*\*: Note that these have partial MFA support, due to their reduced set of available ``pam`` plugins. Support for either an additional password or TOTP factor can be configured, but not both at the same time. The code is actually known to work on FreeBSD/HardenedBSD 10+, but it's only regularly tested under 12.1. \*\*: Note that these have partial MFA support, due to their reduced set of available ``pam`` plugins. Support for either an additional password or TOTP factor can be configured, but not both at the same time. The code is actually known to work on FreeBSD/HardenedBSD 10+, but it's only regularly tested under 13.0.
Other BSD variants partially work but are unsupported and discouraged as they have a severe limitation over the maximum number of supplementary groups (causing problems for group membership and restricted commands checks), no filesystem-level ACL support and missing MFA: Other BSD variants, such as OpenBSD and NetBSD, are unsupported as they have a severe limitation over the maximum number of supplementary groups, causing problems for group membership and restricted commands checks, as well as no filesystem-level ACL support and missing PAM support (hence no MFA).
- OpenBSD 5.4+
- NetBSD 7+
In any case, you are expected to install this on a properly secured machine (including, but not limited to: ``iptables``/``pf``, reduced-set of installed software and daemons, general system hardening, etc.). If you use Debian, following the `CIS Hardening guidelines <https://www.cisecurity.org/benchmark/debian_linux/>`_ is a good start. We have `a tool <https://github.com/ovh/debian-cis>`_ to check for compliance against these guidelines. If you use Debian and don't yet have your own hardened template, this script should help you getting up to speed, and ensuring your hardened host stays hardened over time, through a daily audit you might want to setup through cron. In any case, you are expected to install this on a properly secured machine (including, but not limited to: ``iptables``/``pf``, reduced-set of installed software and daemons, general system hardening, etc.). If you use Debian, following the `CIS Hardening guidelines <https://www.cisecurity.org/benchmark/debian_linux/>`_ is a good start. We have `a tool <https://github.com/ovh/debian-cis>`_ to check for compliance against these guidelines. If you use Debian and don't yet have your own hardened template, this script should help you getting up to speed, and ensuring your hardened host stays hardened over time, through a daily audit you might want to setup through cron.

View file

@ -25,4 +25,3 @@ RUN ["/opt/bastion/bin/admin/install","--new-install"]
ENTRYPOINT /opt/bastion/docker/entrypoint.sh ENTRYPOINT /opt/bastion/docker/entrypoint.sh
# TESTOPT --has-mfa=1 --has-pamtester=1 --has-piv=1 # TESTOPT --has-mfa=1 --has-pamtester=1 --has-piv=1
# TESTFROM centos:7.9.2009 centos:7.8.2003 centos:7.7.1908

View file

@ -25,4 +25,3 @@ RUN ["/opt/bastion/bin/admin/install","--new-install"]
ENTRYPOINT /opt/bastion/docker/entrypoint.sh ENTRYPOINT /opt/bastion/docker/entrypoint.sh
# TESTOPT --has-mfa=1 --has-pamtester=1 --has-piv=1 # TESTOPT --has-mfa=1 --has-pamtester=1 --has-piv=1
# TESTFROM centos:8.3.2011 centos:8.2.2004 centos:8.1.1911

View file

@ -0,0 +1,27 @@
FROM rockylinux:8
LABEL maintainer="stephane.lesimple+bastion@ovhcloud.com"
# cache builds efficiently: just copy the scripts to install packages first
COPY bin/admin/install-ttyrec.sh bin/admin/install-yubico-piv-checker.sh bin/admin/packages-check.sh /opt/bastion/bin/admin/
COPY lib/shell /opt/bastion/lib/shell/
RUN ["/opt/bastion/bin/admin/packages-check.sh","-i","-d","-s"]
RUN ["/opt/bastion/bin/admin/install-ttyrec.sh","-r"]
RUN ["/opt/bastion/bin/admin/install-yubico-piv-checker.sh","-r"]
# disable /dev/kmsg handling by syslog-ng and explicitly enable /dev/log
RUN test -e /etc/syslog-ng/syslog-ng.conf && \
sed -i -re 's=system\(\);=unix-stream("/dev/log");=' /etc/syslog-ng/syslog-ng.conf
# at each modification of our code, we'll start from here thanks to build cache
COPY . /opt/bastion
# tests that the environment works
RUN ["/opt/bastion/bin/dev/perl-check.sh"]
# setup ssh/sshd config and setup bastion install
RUN ["/opt/bastion/bin/admin/install","--new-install"]
# start at entrypoint
ENTRYPOINT /opt/bastion/docker/entrypoint.sh
# TESTOPT --has-mfa=1 --has-pamtester=1 --has-piv=1

View file

@ -68,8 +68,8 @@ PubkeyAuthentication yes
# ... (set to yes if sshpass is to be used) # ... (set to yes if sshpass is to be used)
PasswordAuthentication no PasswordAuthentication no
# ChallengeResponseAuthentication=yes forces KbdInteractiveAuthentication=yes in the openssh code! # ChallengeResponseAuthentication=yes forces KbdInteractiveAuthentication=yes in the openssh code!
ChallengeResponseAuthentication no ChallengeResponseAuthentication yes
KbdInteractiveAuthentication no KbdInteractiveAuthentication yes
# ... not host-based # ... not host-based
HostbasedAuthentication no HostbasedAuthentication no
# now we specify the auth methods order we want for manual ssh calls. # now we specify the auth methods order we want for manual ssh calls.
@ -80,7 +80,7 @@ HostbasedAuthentication no
# specified hereafter will be ignored. if you want to force-disable # specified hereafter will be ignored. if you want to force-disable
# a method, set it to "no" in the list above, as those will never be # a method, set it to "no" in the list above, as those will never be
# overridden by the code. # overridden by the code.
PreferredAuthentications publickey PreferredAuthentications publickey,keyboard-interactive
# === LOGIN ### # === LOGIN ###

View file

@ -101,9 +101,6 @@ AcceptEnv LANG LC_*
# === SYSTEM === # === SYSTEM ===
# Use kernel sandbox mechanisms where possible in unprivilegied processes (seccomp)
UsePrivilegeSeparation sandbox
# sshd log level at verbose in auth facility for auditing purposes # sshd log level at verbose in auth facility for auditing purposes
LogLevel VERBOSE LogLevel VERBOSE
SyslogFacility AUTH SyslogFacility AUTH

View file

@ -113,9 +113,6 @@ AcceptEnv LANG LC_*
# === SYSTEM === # === SYSTEM ===
# Use kernel sandbox mechanisms where possible in unprivilegied processes (seccomp)
UsePrivilegeSeparation sandbox
# sshd log level at verbose in auth facility for auditing purposes # sshd log level at verbose in auth facility for auditing purposes
LogLevel VERBOSE LogLevel VERBOSE
SyslogFacility AUTH SyslogFacility AUTH

View file

@ -113,9 +113,6 @@ AcceptEnv LANG LC_*
# === SYSTEM === # === SYSTEM ===
# Use kernel sandbox mechanisms where possible in unprivilegied processes (seccomp)
UsePrivilegeSeparation sandbox
# sshd log level at verbose in auth facility for auditing purposes # sshd log level at verbose in auth facility for auditing purposes
LogLevel VERBOSE LogLevel VERBOSE
SyslogFacility AUTH SyslogFacility AUTH

View file

@ -72,19 +72,21 @@ RekeyLimit 512M 6h
PubkeyAuthentication yes PubkeyAuthentication yes
# ... not password # ... not password
PasswordAuthentication no PasswordAuthentication no
# ... not keyboard interactive # ... keyboard interactive (needed for MFA through PAM)
KbdInteractiveAuthentication no KbdInteractiveAuthentication yes
# ... not challenge-response # ... challenge-response (needed for MFA through PAM)
ChallengeResponseAuthentication no ChallengeResponseAuthentication yes
# ... not host-based # ... not host-based
HostbasedAuthentication no HostbasedAuthentication no
# just in case, we also explicitly deny empty passwords # just in case, we also explicitly deny empty passwords
PermitEmptyPasswords no PermitEmptyPasswords no
# root login is allowed only with public keys, not passwords # this needs to be set at "yes" to allow PAM keyboard-interactive authentication,
# this can be disabled entirely for auditing reasons (forcing admins to use sudo) # which is not a security issue because the AuthenticationMethods below force the use of
PermitRootLogin without-password # either publickey or publickey+keyboard-interactive, hence password-only login is never
# possible, for root or any other account for that matter
PermitRootLogin yes
# === LOGIN === # === LOGIN ===
@ -102,9 +104,6 @@ AcceptEnv LANG LC_*
# === SYSTEM === # === SYSTEM ===
# Use kernel sandbox mechanisms where possible in unprivilegied processes (seccomp)
UsePrivilegeSeparation sandbox
# sshd log level at verbose in auth facility for auditing purposes # sshd log level at verbose in auth facility for auditing purposes
LogLevel VERBOSE LogLevel VERBOSE
SyslogFacility AUTH SyslogFacility AUTH
@ -114,3 +113,20 @@ StrictModes yes
# never use dns (slows down connections) # never use dns (slows down connections)
UseDNS no UseDNS no
# === AuthenticationMethods vs potential root OTP vs potential user MFA ===
# 2FA has been configured for root, so we force pubkey+PAM for it
#Match User root
# AuthenticationMethods publickey,keyboard-interactive:pam
# Unconditionally skip PAM auth for members of the bastion-nopam group
Match Group bastion-nopam
AuthenticationMethods publickey
# if in one of the mfa groups AND the osh-pubkey-auth-optional group, use publickey+pam OR pam
Match Group mfa-totp-configd,mfa-password-configd Group osh-pubkey-auth-optional
AuthenticationMethods publickey,keyboard-interactive:pam keyboard-interactive:pam
# if in one of the mfa groups, use publickey AND pam
Match Group mfa-totp-configd,mfa-password-configd
AuthenticationMethods publickey,keyboard-interactive:pam
# by default, always ask the publickey (no PAM)
Match All
AuthenticationMethods publickey

View file

@ -43,7 +43,7 @@ testsuite_accountinfo()
json .value.already_seen_before 0 .value.last_activity null json .value.already_seen_before 0 .value.last_activity null
json .value.max_inactive_days null json .value.max_inactive_days null
if [ "$OS_FAMILY" = Linux ]; then if [ "$OS_FAMILY" = Linux ]; then
.value.password.date_changed $(date +%Y-%m-%d) json .value.password.date_changed $(date +%Y-%m-%d)
fi fi
# a2 connects, which will update already_seen_before # a2 connects, which will update already_seen_before