2007-07-12 15:47:19 +00:00
#!/bin/sh
#
# This shell script checks the TLS certificates and options needed
# for the secure client/server support of libvirt as documented at
# http://libvirt.org/remote.html#Remote_certificates
#
# Daniel Veillard <veillard@redhat.com>
#
USER=`who am i | awk '{ print $1 }'`
SERVER=1
CLIENT=1
PORT=16514
#
# First get certtool
#
CERTOOL=`which certtool 2>/dev/null`
2011-02-20 22:29:25 +02:00
if [ ! -x "$CERTOOL" ]
2007-07-12 15:47:19 +00:00
then
2010-04-21 16:52:10 -05:00
echo "Could not locate the certtool program"
echo "make sure the gnutls-utils (or gnutls-bin) package is installed"
2007-07-12 15:47:19 +00:00
exit 1
fi
2011-02-20 22:29:26 +02:00
echo Found "$CERTOOL"
2007-07-12 15:47:19 +00:00
#
# Check the directory structure
#
2010-04-21 16:52:10 -05:00
SYSCONFDIR="@SYSCONFDIR@"
PKI="$SYSCONFDIR/pki"
2011-02-20 22:29:26 +02:00
if [ ! -d "$PKI" ]
2007-07-12 15:47:19 +00:00
then
echo the $PKI directory is missing, it is usually
echo installed as part of the filesystem or openssl packages
exit 1
fi
2011-02-20 22:29:26 +02:00
if [ ! -r "$PKI" ]
2007-07-12 15:47:19 +00:00
then
echo the $PKI directory is not readable by $USER
echo "as root do: chmod a+rx $PKI"
exit 1
fi
2011-02-20 22:29:26 +02:00
if [ ! -x "$PKI" ]
2007-07-12 15:47:19 +00:00
then
echo the $PKI directory is not listable by $USER
echo "as root do: chmod a+rx $PKI"
exit 1
fi
CA="$PKI/CA"
2011-02-20 22:29:26 +02:00
if [ ! -d "$CA" ]
2007-07-12 15:47:19 +00:00
then
echo the $CA directory is missing, it is usually
echo installed as part of the or openssl package
exit 1
fi
2011-02-20 22:29:26 +02:00
if [ ! -r "$CA" ]
2007-07-12 15:47:19 +00:00
then
echo the $CA directory is not readable by $USER
echo "as root do: chmod a+rx $CA"
exit 1
fi
2011-02-20 22:29:26 +02:00
if [ ! -x "$CA" ]
2007-07-12 15:47:19 +00:00
then
echo the $CA directory is not listable by $USER
echo "as root do: chmod a+rx $CA"
exit 1
fi
LIBVIRT="$PKI/libvirt"
2011-02-20 22:29:26 +02:00
if [ ! -d "$LIBVIRT" ]
2007-07-12 15:47:19 +00:00
then
echo the $LIBVIRT directory is missing, it is usually
echo installed by the libvirt package
echo "as root do: mkdir -m 755 $LIBVIRT ; chown root:root $LIBVIRT"
exit 1
fi
2011-02-20 22:29:26 +02:00
if [ ! -r "$LIBVIRT" ]
2007-07-12 15:47:19 +00:00
then
echo the $LIBVIRT directory is not readable by $USER
echo "as root do: chown root:root $LIBVIRT ; chmod 755 $LIBVIRT"
exit 1
fi
2011-02-20 22:29:26 +02:00
if [ ! -x "$LIBVIRT" ]
2007-07-12 15:47:19 +00:00
then
echo the $LIBVIRT directory is not listable by $USER
echo "as root do: chown root:root $LIBVIRT ; chmod 755 $LIBVIRT"
exit 1
fi
LIBVIRTP="$LIBVIRT/private"
2011-02-20 22:29:26 +02:00
if [ ! -d "$LIBVIRTP" ]
2007-07-12 15:47:19 +00:00
then
echo the $LIBVIRTP directory is missing, it is usually
echo installed by the libvirt package
echo "as root do: mkdir -m 755 $LIBVIRTP ; chown root:root $LIBVIRTP"
exit 1
fi
2011-02-20 22:29:26 +02:00
if [ ! -r "$LIBVIRTP" ]
2007-07-12 15:47:19 +00:00
then
echo the $LIBVIRTP directory is not readable by $USER
echo "as root do: chown root:root $LIBVIRTP ; chmod 755 $LIBVIRTP"
exit 1
fi
2011-02-20 22:29:26 +02:00
if [ ! -x "$LIBVIRTP" ]
2007-07-12 15:47:19 +00:00
then
echo the $LIBVIRTP directory is not listable by $USER
echo "as root do: chown root:root $LIBVIRTP ; chmod 755 $LIBVIRTP"
exit 1
fi
#
# Now check the certificates
# First the CA certificate
#
2011-02-20 22:29:26 +02:00
if [ ! -f "$CA/cacert.pem" ]
2007-07-12 15:47:19 +00:00
then
echo the CA certificate $CA/cacert.pem is missing while it
echo should be installed on both client and servers
echo "see http://libvirt.org/remote.html#Remote_TLS_CA"
echo on how to install it
exit 1
fi
2011-02-20 22:29:26 +02:00
if [ ! -r "$CA/cacert.pem" ]
2007-07-12 15:47:19 +00:00
then
echo the CA certificate $CA/cacert.pem is not readable by $USER
echo "as root do: chmod 644 $CA/cacert.pem"
exit 1
fi
2010-04-29 16:20:50 -05:00
sed_get_org='/Issuer:/ {
s/.*Issuer:.*CN=//
s/,.*//
p
}'
2011-02-20 22:29:26 +02:00
ORG=`"$CERTOOL" -i --infile "$CA/cacert.pem" | sed -n "$sed_get_org"`
2010-04-21 16:52:10 -05:00
if [ "$ORG" = "" ]
2007-07-12 15:47:19 +00:00
then
echo the CA certificate $CA/cacert.pem does not define the organization
echo it should probably regenerated
echo "see http://libvirt.org/remote.html#Remote_TLS_CA"
echo on how to regenerate it
exit 1
fi
echo Found CA certificate $CA/cacert.pem for $ORG
# Second the client certificates
2011-02-20 22:29:26 +02:00
if [ -f "$LIBVIRT/clientcert.pem" ]
2007-07-12 15:47:19 +00:00
then
2011-02-20 22:29:26 +02:00
if [ ! -r "$LIBVIRT/clientcert.pem" ]
2007-07-12 15:47:19 +00:00
then
echo Client certificate $LIBVIRT/clientcert.pem should be world readable
2010-04-21 17:21:06 -06:00
echo "as root do: chown root:root $LIBVIRT/clientcert.pem ; chmod 644 $LIBVIRT/clientcert.pem"
2007-07-12 15:47:19 +00:00
else
2011-02-20 22:29:26 +02:00
S_ORG=`"$CERTOOL" -i --infile "$LIBVIRT/clientcert.pem" | grep Subject: | sed 's+.*O=\([a-zA-Z \._-]*\).*+\1+'`
2010-04-21 17:21:06 -06:00
if [ "$ORG" != "$S_ORG" ]
then
echo The CA certificate and the client certificate do not match
echo CA organization: $ORG
echo Client organization: $S_ORG
fi
2011-02-20 22:29:26 +02:00
CLIENT=`"$CERTOOL" -i --infile "$LIBVIRT/clientcert.pem" | grep Subject: | sed 's+.*CN=\(.[a-zA-Z \._-]*\).*+\1+'`
2010-04-21 17:21:06 -06:00
echo Found client certificate $LIBVIRT/clientcert.pem for $CLIENT
2011-02-20 22:29:26 +02:00
if [ ! -e "$LIBVIRTP/clientkey.pem" ]
2010-04-21 17:21:06 -06:00
then
echo Missing client private key $LIBVIRTP/clientkey.pem
else
echo Found client private key $LIBVIRTP/clientkey.pem
2011-02-20 22:29:26 +02:00
OWN=`ls -l "$LIBVIRTP/clientkey.pem" | awk '{ print $3 }'`
MOD=`ls -l "$LIBVIRTP/clientkey.pem" | awk '{ print $1 }'`
2010-04-21 17:21:06 -06:00
if [ "$OWN" != "root" ]
then
echo The client private key should be owned by root
echo "as root do: chown root $LIBVIRTP/clientkey.pem"
fi
if [ "$MOD" != "-rw-r--r--" ]
then
echo The client private key need to be read by client tools
echo "as root do: chmod 644 $LIBVIRTP/clientkey.pem"
fi
fi
2007-07-12 15:47:19 +00:00
fi
else
2011-02-20 22:29:26 +02:00
echo Did not find "$LIBVIRT/clientcert.pem" client certificate
2007-07-12 15:47:19 +00:00
echo The machine cannot act as a client
echo "see http://libvirt.org/remote.html#Remote_TLS_client_certificates"
echo on how to regenerate it
CLIENT=0
fi
# Third the server certificates
2011-02-20 22:29:26 +02:00
if [ -f "$LIBVIRT/servercert.pem" ]
2007-07-12 15:47:19 +00:00
then
2011-02-20 22:29:26 +02:00
if [ ! -r "$LIBVIRT/servercert.pem" ]
2007-07-12 15:47:19 +00:00
then
echo Server certificate $LIBVIRT/servercert.pem should be world readable
2010-04-21 17:21:06 -06:00
echo "as root do: chown root:root $LIBVIRT/servercert.pem ; chmod 644 $LIBVIRT/servercert.pem"
2007-07-12 15:47:19 +00:00
else
2011-02-20 22:29:26 +02:00
S_ORG=`"$CERTOOL" -i --infile "$LIBVIRT/servercert.pem" | grep Subject: | sed 's+.*O=\([a-zA-Z\. _-]*\).*+\1+'`
2010-04-21 17:21:06 -06:00
if [ "$ORG" != "$S_ORG" ]
then
echo The CA certificate and the server certificate do not match
echo CA organization: $ORG
echo Server organization: $S_ORG
fi
2011-02-20 22:29:26 +02:00
S_HOST=`"$CERTOOL" -i --infile "$LIBVIRT/servercert.pem" | grep Subject: | sed 's+.*CN=\([a-zA-Z\. _-]*\)+\1+'`
2010-04-21 17:21:06 -06:00
if test "$S_HOST" != "`hostname -s`" && test "$S_HOST" != "`hostname`"
then
echo The server certificate does not seem to match the host name
echo hostname: '"'`hostname`'"'
echo Server certificate CN: '"'$S_HOST'"'
fi
echo Found server certificate $LIBVIRT/servercert.pem for $S_HOST
2011-02-20 22:29:26 +02:00
if [ ! -e "$LIBVIRTP/serverkey.pem" ]
2010-04-21 17:21:06 -06:00
then
echo Missing server private key $LIBVIRTP/serverkey.pem
else
echo Found server private key $LIBVIRTP/serverkey.pem
2011-02-20 22:29:26 +02:00
OWN=`ls -l "$LIBVIRTP/serverkey.pem" | awk '{ print $3 }'`
MOD=`ls -l "$LIBVIRTP/serverkey.pem" | awk '{ print $1 }'`
2010-04-21 17:21:06 -06:00
if [ "$OWN" != "root" ]
then
echo The server private key should be owned by root
echo "as root do: chown root $LIBVIRTP/serverkey.pem"
fi
if [ "$MOD" != "-rw-------" ]
then
echo The server private key need to be read only by root
echo "as root do: chmod 600 $LIBVIRTP/serverkey.pem"
fi
fi
2007-07-12 15:47:19 +00:00
fi
else
2011-02-20 22:29:26 +02:00
echo Did not find $LIBVIRT/servercert.pem server certificate
2007-07-12 15:47:19 +00:00
echo The machine cannot act as a server
echo "see http://libvirt.org/remote.html#Remote_TLS_server_certificates"
echo on how to regenerate it
SERVER=0
fi
if [ "$SERVER" = "1" ]
then
2010-04-21 16:52:10 -05:00
if [ -r "$SYSCONFDIR"/sysconfig/libvirtd ]
2007-07-12 15:47:19 +00:00
then
2010-04-21 16:52:10 -05:00
if grep "^LIBVIRTD_ARGS.*--listen" "$SYSCONFDIR"/sysconfig/libvirtd \
>/dev/null 2>&1
2010-04-21 17:21:06 -06:00
then
2010-04-21 16:52:10 -05:00
:
else
echo Make sure "$SYSCONFDIR"/sysconfig/libvirtd is setup to listen to
2010-04-21 17:21:06 -06:00
echo TCP/IP connections and restart the libvirtd service
fi
2007-07-12 15:47:19 +00:00
fi
2010-04-21 16:52:10 -05:00
if [ -r "$SYSCONFDIR"/sysconfig/iptables ]
2007-07-12 15:47:19 +00:00
then
2011-02-20 22:29:26 +02:00
if grep "$PORT" "$SYSCONFDIR"/sysconfig/iptables >/dev/null 2>&1
2010-04-21 17:21:06 -06:00
then
2010-04-21 16:52:10 -05:00
:
else
echo Make sure "$SYSCONFDIR"/sysconfig/iptables is setup to allow
2010-04-21 17:21:06 -06:00
echo incoming TCP/IP connections on port $PORT and
echo restart the iptables service
fi
2007-07-12 15:47:19 +00:00
fi
fi
2009-09-16 14:42:57 +01:00
exit 0
: <<=cut
=pod
=head1 NAME
virt-pki-validate - validate libvirt PKI files are configured correctly
=head1 SYNOPSIS
virt-pki-validate
=head1 DESCRIPTION
2009-09-22 11:42:06 +02:00
This tool validates that the necessary PKI files are configured for
2009-09-16 14:42:57 +01:00
a secure libvirt server or client using the TLS encryption protocol.
It will report any missing certificate or key files on the host. It
2009-09-22 11:42:06 +02:00
should be run as root to ensure it can read all the necessary files
2009-09-16 14:42:57 +01:00
=head1 EXIT STATUS
Upon successful validation, an exit status of 0 will be set. Upon
failure a non-zero status will be set.
=head1 AUTHOR
Richard Jones
=head1 BUGS
Report any bugs discovered to the libvirt community via the
mailing list C<http://libvirt.org/contact.html> or bug tracker C<http://libvirt.org/bugs.html>.
Alternatively report bugs to your software distributor / vendor.
=head1 COPYRIGHT
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 17:02:10 -06:00
Copyright (C) 2006-2010 by Red Hat, Inc.
2009-09-16 14:42:57 +01:00
=head1 LICENSE
virt-pki-validate is distributed under the terms of the GNU GPL v2+.
This is free software; see the source for copying conditions. There
is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE
=head1 SEE ALSO
C<virsh(1)>, online PKI setup instructions C<http://libvirt.org/remote.html>
=cut