2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2026-10-21 15:18:19 +00:00
Files
xcat-core/xCAT-test/unit/fips_ssh_keys.t
T
2026-10-05 18:14:20 -03:00

90 lines
3.8 KiB
Perl

#!/usr/bin/env perl
use strict;
use warnings;
use FindBin;
use File::Path qw(make_path);
use File::Spec;
use File::Slurper qw(read_text write_text);
use File::Temp qw(tempdir);
use Test::More;
use lib "$FindBin::Bin/../lib";
use lib "$FindBin::Bin/../../perl-xCAT";
use XCAT::Test::File qw(repo_path);
use xCAT::Utils;
my $tmpdir = tempdir(CLEANUP => 1);
my $fips_status = File::Spec->catfile($tmpdir, 'fips_enabled');
write_text($fips_status, "1\n");
ok(xCAT::Utils->isFIPS($fips_status), 'kernel status 1 enables FIPS mode');
write_text($fips_status, "0\n");
ok(!xCAT::Utils->isFIPS($fips_status), 'kernel status 0 disables FIPS mode');
write_text($fips_status, " 1 \n");
ok(xCAT::Utils->isFIPS($fips_status), 'kernel status permits surrounding whitespace');
write_text($fips_status, "enabled\n");
ok(!xCAT::Utils->isFIPS($fips_status), 'malformed kernel status does not enable FIPS mode');
write_text($fips_status, '');
ok(!xCAT::Utils->isFIPS($fips_status), 'empty kernel status does not enable FIPS mode');
ok(!xCAT::Utils->isFIPS(File::Spec->catfile($tmpdir, 'missing')), 'missing kernel status is not FIPS mode');
foreach my $case (
['el7', 1], ['el8', 1], ['el9', 1], ['el10', 0], ['el11', 0],
['ubuntu', 1], ['sles12', 1], ['sles15', 1], ['aix', 1],
) {
my ($platform, $legacy_allowed) = @{$case};
is(xCAT::Utils->dsaHostKeyAllowed($platform, 0), $legacy_allowed,
"$platform retains its non-FIPS DSA policy");
is(xCAT::Utils->dsaHostKeyAllowed($platform, 1), 0,
"$platform rejects DSA in FIPS mode");
}
SKIP: {
skip 'statelite requires Linux shell utilities', 12 unless $^O eq 'linux';
foreach my $with_dsa (0, 1) {
my $fixture = tempdir(CLEANUP => 1);
my $image = "$fixture/image";
make_path("$fixture/hostkeys", "$fixture/client",
"$image/etc/ssh", "$image/root/.ssh");
write_text("$image/etc/ssh/sshd_config", "X11Forwarding no\n");
write_text("$fixture/hostkeys/ssh_host_rsa_key", "rsa-host-key\n");
write_text("$fixture/hostkeys/ssh_host_dsa_key", "dsa-host-key\n")
if $with_dsa;
write_text("$fixture/client/$_", "client-$_\n") for qw(id_rsa id_rsa.pub config);
my $source = read_text(repo_path('xCAT-server/share/xcat/netboot/add-on/statelite/add_ssh'));
$source =~ s{/etc/xcat/hostkeys}{$fixture/hostkeys}g;
$source =~ s{/install/postscripts/_ssh}{$fixture/postscript-keys}g;
$source =~ s{(?<!\$ROOTDIR)/root/\.ssh}{$fixture/client}g;
$source =~ s{(?<!\$ROOTDIR)/etc/ssh/ssh_config}{$fixture/client/ssh_config}g;
write_text("$fixture/add_ssh", $source);
my $pid = fork();
die "fork: $!" unless defined $pid;
if (!$pid) {
open(STDOUT, '>', "$fixture/stdout") or die $!;
open(STDERR, '>', "$fixture/stderr") or die $!;
$ENV{XCATROOT} = $fixture;
exec('bash', "$fixture/add_ssh", $image);
die "exec bash: $!";
}
waitpid($pid, 0);
is($?, 0, "statelite completes with DSA present=$with_dsa");
is(read_text("$fixture/stderr"), '',
"statelite reports no missing-key errors with DSA present=$with_dsa");
like(read_text("$fixture/client/ssh_config"), qr/StrictHostKeyChecking no/,
'statelite writes client configuration only inside the fixture');
is(read_text("$image/etc/ssh/ssh_host_rsa_key"), "rsa-host-key\n",
"statelite preserves the RSA host key with DSA present=$with_dsa");
is(-f "$image/etc/ssh/ssh_host_dsa_key" ? 1 : 0, $with_dsa,
'statelite copies the optional DSA key only when supplied');
is((stat("$image/etc/ssh/ssh_host_rsa_key"))[2] & oct('0777'), oct('0600'),
'statelite limits host-key permissions');
}
}
done_testing();