Webserver Härtung

Die IT-Sicherheitsbranche bleibt nicht stehen, deswegen gibt es hier mal wieder einen Aktualisierung/Ergänzung zu meinem Artikel über sichere Webserver-Konfiguration.

Wo ich früher eigentlich ausschließlich SSLlabs zum Testen meiner Webserver Konfiguration eingesetzt habe steht bei mir mittlerweile eine Kombination aus diversen Tools im Vordergrund.

Weiterlesen

Puppet Config für einen sicheren Webserver

Hier mal die Puppet Config für meinen Webserver. Das ganze besteht aus mehreren Teilen, der Webserver allgemein:

class blue-web-srv::srv {
	
	class { 'apache': 
		server_tokens  => 'Prod',
		server_signature => 'EMail',
		trace_enable => 'off',
		mpm_module => 'prefork'
	}
	apache::listen { '80': }
	apache::listen { '443': }
	class { 'apache::mod::ssl':
		ssl_cipher => 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256',
		ssl_protocol => [ 'all', '-SSLv2', '-SSLv3', '-TLSv1', '-TLSv1.1' ],
		ssl_compression => false,
		ssl_honorcipherorder => true,
		ssl_stapling => true,		
	}
	class { 'apache::mod::rewrite': }
	class { 'apache::mod::headers': }
	class { 'apache::mod::php': }

}

dann der Config für den VHost:

class blue-web-srv::sebastianhaeutlede {

	$domain = 'sebastian-haeutle.de'
	$alias = ['www.haeutleit.de', 'haeutleit.de', 'www.sebastian-haeutle.de', 'www.sebastian-haeutle.com', 'sebastian-haeutle.com', 'www.sebastianhaeutle.de', 'sebastianhaeutle.de']
	
	file { "/opt/myssl/${domain}":
		ensure => 'directory',
		owner  => 'root',
		group  => 'root',
		mode   => '0755',
	}
	
	file { "/opt/myssl/${domain}/request.cnf":
		ensure  => file,
		content => template('blue-web-srv/request.cnf.erb'),
	}
	
	apache::vhost { "${domain}_non-ssl":
		servername => $domain,
		serveraliases => $alias,
		serveradmin => 'root@haeutle-it.de',
		port       => '80',
		ip_based   => true,
		docroot    => "/var/httpd/${domain}",
		docroot_owner => 'www-data',
		docroot_group => 'www-data',
		redirect_status => 'permanent',
		rewrite_cond => '%{HTTPS} off',
		rewrite_rule => '(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]',
	}
	apache::vhost { "${domain}_ssl":
		servername => $domain,
		serveraliases => $alias,
		serveradmin => 'root@haeutle-it.de',
		port       => '443',
		ip_based   => true,
		docroot    => "/var/httpd/${domain}",
		docroot_owner => 'www-data',
		docroot_group => 'www-data',
		ssl     => true,
		ssl_cert => '/opt/myssl/fullchain.pem',
		ssl_key  => '/opt/myssl/privkey.pem',
		ssl_openssl_conf_cmd => 'DHParameters "/opt/myssl/dhparam.pem"',
		ssl_stapling_timeout => '5',
		ssl_stapling_return_errors => false,
		directories  => [
			{ path           =>  "/var/www/${domain}",
			allow_override => ['all'],
			},
		],
		headers => [
			'always set Strict-Transport-Security: "max-age=31536001; includeSubDomains"',
			'always set X-Content-Type-Options nosniff',
			'edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure',
			'set X-XSS-Protection "1; mode=block"',
			'append X-Frame-Options "SAMEORIGIN"',
			'set X-Content-Security-Policy "default-src https:"',
			'set Public-Key-Pins "pin-sha256=\"XXXXX=\"; max-age=100800; includeSubDomains"'
			],
	}

}

und schließlich noch eine Datenbank für das mysql.

Dieses Setup reicht für ein A+ Rantig auf SSLlabs und immerhin ein B Ranting bei observatory.mozilla.org

CAcert Self-Signed Certificate in apache2

Für mich als Gedankenstütze: Wie richte ich einfach und schnell ein neues Zertifikat mit CAcert ein.

mkdir /etc/myssl/DOMAIN
cd /etc/myssl/DOMAIN
mkdir private
mkdir public

openssl genrsa -out private/privkey.pem 4096
chmod 600 private/privkey.pem
openssl req -new -key private/privkey.pem -out cert.csr 
## „CommonName” = Domainname z.B. „meinedomain.com„
cat cert.csr
## Output bei CAcert einreichen
vi public/domain.pem
## Output von CAcert speichern
wget http://www.cacert.org/certs/class3.crt
## Apache Konfigurieren
a2enmod ssl

vi /etc/apache2/ports.conf
<IfModule mod_ssl.c>
Listen 443
</IfModule>

<VirtualHost *:443>
DocumentRoot /var/www
ServerName meinedomain.com
SSLEngine on
SSLCertificateKeyFile /etc/myssl/DOMAIN/private/privkey.pem
SSLCertificateFile /etc/myssl/DOMAIN/public/domain.pem
SSLCACertificateFile /etc/myssl/DOMAIN/intermediate_ca.crt
SSLCipherSuite 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA:EECDH:EDH+AESGCM:EDH:+3DES:ECDH+AESGCM:ECDH+AES:ECDH:AES:HIGH:MEDIUM:!RC4:!CAMELLIA:!SEED:!aNULL:!MD5:!eNULL:!LOW:!EXP:!DSS:!PSK:!SRP'
</VirtualHost>

service apache2 restart