ich beschäftige mich (wieder mal) mit der Sicherheit meines Nextcloud Servers.
Im Moment erhalte ich von dem securityheaders.io Test zwar eine Note A (A+ nicht möglich, weil Public Key Pinning wegen Letsencrypt Zertifikat ausscheidet), allerdings mit der Warnung
Ich finde leider keine gute Erklärung, wie ich das unter nginx umsetzen/ändern kann. Meine aktuelle config sieht so aus:Content-Security-Policy This policy contains 'unsafe-eval' which is dangerous in the script-src directive.
Code: Alles auswählen
server {
[..]
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy "no-referrer";
[..]
}
Code: Alles auswählen
add_header Content-Security-Policy "default-src 'self';";
Vielleicht steh ich grad etwas auf dem Schlauch, aber so wirklich komm ich nicht weiter. Würd mich freuen, wenn mir jemand den entscheidenden Tipp geben könnteContent-Security-Policy There was a duplicate Content-Security-Policy header.

EDIT: Liegt wohl nicht an nginx, sondern an Nextcloud. In der Datei "/lib/private/legacy/response.php" wird der Header "modifiziert". Mir persönlich war die Methode über php völlig unbekannt - kannte bisher nur die via htaccess und die für nginx. Naja, man lernt nie aus

Code: Alles auswählen
public static function addSecurityHeaders() {
/**
* FIXME: Content Security Policy for legacy ownCloud components. This
* can be removed once \OCP\AppFramework\Http\Response from the AppFramework
* is used everywhere.
* @see \OCP\AppFramework\Http\Response::getHeaders
*/
$policy = 'default-src \'self\'; '
. 'script-src \'self\' \'unsafe-eval\' \'nonce-'.\OC::$server->getContentSecurityPolicyNonceManager()->getNonce().'\'; '
. 'style-src \'self\' \'unsafe-inline\'; '
. 'frame-src *; '
. 'img-src * data: blob:; '
. 'font-src \'self\' data:; '
. 'media-src *; '
. 'connect-src *';
header('Content-Security-Policy:' . $policy);
// Send fallback headers for installations that don't have the possibility to send
// custom headers on the webserver side
if(getenv('modHeadersAvailable') !== 'true') {
header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters
header('X-Content-Type-Options: nosniff'); // Disable sniffing the content type for IE
header('X-Frame-Options: Sameorigin'); // Disallow iFraming from other domains
header('X-Robots-Tag: none'); // https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag
header('X-Download-Options: noopen'); // https://msdn.microsoft.com/en-us/library/jj542450(v=vs.85).aspx
header('X-Permitted-Cross-Domain-Policies: none'); // https://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html
}
}