概要

Helmet はExpressのミドルウェアでセキュリティ関連のHTTPヘッダを簡単に設定でき、Express公式でも紹介されています。
デフォルトでは設定されないヘッダについて調査しました。英語はgoogle翻訳です。
調査時のHelmetのバージョンは 3.15.0 です。

対応表

Module Default?
contentSecurityPolicy for setting Content Security Policy
crossdomain for handling Adobe products' crossdomain requests
dnsPrefetchControl controls browser DNS prefetching
expectCt for handling Certificate Transparency
featurePolicy to limit your site's features
frameguard to prevent clickjacking
hidePoweredBy to remove the X-Powered-By header
hpkp for HTTP Public Key Pinning
hsts for HTTP Strict Transport Security
ieNoOpen sets X-Download-Options for IE8+
noCache to disable client-side caching
noSniff to keep clients from sniffing the MIME type
referrerPolicy to hide the Referer header
xssFilter adds some small XSS protections

https://github.com/helmetjs/helmet#how-it-works から引用

デフォル設定のないHTTPヘッダ

Content Security Policy

Content Security Policy
CSPモジュールは、JavaScript、CSS、プラグインなどの悪意のある侵入から保護するためのContent-Security-Policyヘッダーを設定します。

実装例

// Make sure you run "npm install helmet" to get the Helmet package.  
const helmet = require('helmet')  

app.use(helmet.contentSecurityPolicy({  
  directives: {  
    defaultSrc: ["'self'"]  
        }  
}))  

追加ヘッダ
Content-Security-Policy: default-src 'self'

X-Permitted-Cross-Domain-Policies

X-Permitted-Cross-Domain-Policies
Helmetのcrossdomainミドルウェアは、Adobe FlashとAdobe Acrobatがあなたのサイトにコンテンツをロードするのを防ぎます。

実装例

// Make sure you run "npm install helmet" to get the Helmet package.  
const helmet = require('helmet')  

app.use(helmet.permittedCrossDomainPolicies())  

追加ヘッダ
X-Permitted-Cross-Domain-Policies: none

Expect-CT

Expect-CT
Expect-CT HTTPヘッダーは、ブラウザに証明書の透過性を期待するように指示します。証明書の透明性とこのヘッダーの詳細については、このブログ記事進行中の仕様を参照してください。

実装例

const helmet = require('helmet');  

// Sets Expect-CT: max-age=123  
app.use(helmet.expectCt({ maxAge: 123 }));  

追加ヘッダ
Expect-CT: max-age=123

Feature-Policy

Feature-Policy
HelmetのfeaturePolicyミドルウェアでは、使用できるブラウザ機能を制限できます。たとえば、全画面または振動APIを無効にすることができます。

実装例

// Make sure you run "npm install helmet" to get the Helmet package.  
const helmet = require('helmet')  

app.use(helmet.featurePolicy({  
  features: {  
    fullscreen: ["'self'"],  
    vibrate: ["'none'"],  
    payment: ['example.com'],  
    syncXhr: ["'none'"]  
  }  
}))  

追加ヘッダ
Feature-Policy: fullscreen 'self';vibrate 'none';payment example.com;sync-xhr 'none'

HTTP Public Key Pinning

HTTP Public Key Pinning

このヘッダー(ミドルウェア)の使用は推奨されません。
Expect-CT を使うことが推奨されているようです。
参考:Certificate Transparency の仕組みと HPKP から Expect-CT への移行

No Cache

No Cache
nocacheミドルウェアはいくつかのヘッダーを設定してブラウザのキャッシュを無効にすることを目指しています。

実装例

// Make sure you run "npm install helmet" to get the Helmet package.  
const helmet = require('helmet')  

app.use(helmet.noCache())  

追加ヘッダ
Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate

Referrer Policy

Referrer Policy
Referrerポリシーモジュールは、Referrer-Policyヘッダーを設定することによって、Refererヘッダーの動作を制御できます。

実装例

// Make sure you run "npm install helmet" to get the Helmet package.  
const helmet = require('helmet')  

// Sets "Referrer-Policy: same-origin".  
app.use(helmet.referrerPolicy({ policy: 'same-origin' }))  

追加ヘッダ
Referrer-Policy:same-origin

全部入りの実装例

各ヘッダの値はプロダクトによって調整する必要があります。

const app = express();  
const helmet = require('helmet');  

// HTTPヘッダにセキュリティ関連の設定を追加  
app.set(helmet());  
// Content-Security-Policy: default-src 'self';  
app.use(helmet.contentSecurityPolicy({  
  directives: {  
    defaultSrc: ["'self'"]  
  }  
}));  
// X-Permitted-Cross-Domain-Policies: none  
app.use(helmet.permittedCrossDomainPolicies());  
// Expect-CT: max-age=123    
app.use(helmet.expectCt({ maxAge: 123 }));  
// Feature-Policy: fullscreen 'self';vibrate 'none';payment example.com;sync-xhr 'none'   
app.use(helmet.featurePolicy({  
  features: {  
    fullscreen: ["'self'"],  
    vibrate: ["'none'"],  
    payment: ['example.com'],  
    syncXhr: ["'none'"]  
  }  
}));  
// Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate   
app.use(helmet.noCache());  
// Referrer-Policy: same-origin    
app.use(helmet.referrerPolicy({ policy: 'same-origin' }));  

レスポンスヘッダ

HTTP/1.1 200 OK  
X-Powered-By: Express  
Content-Security-Policy: default-src 'self'  
X-Permitted-Cross-Domain-Policies: none  
Expect-CT: max-age=123  
Feature-Policy: fullscreen 'self';vibrate 'none';payment example.com;sync-xhr 'none'  
Surrogate-Control: no-store  
Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate  
Pragma: no-cache  
Expires: 0  
Referrer-Policy: same-origin  
Content-Type: text/html; charset=utf-8  
Content-Length: 23  
ETag: W/"17-dz3lQFWsvaILP0XWy2YesfdbyNA"  
Date: Fri, 14 Dec 2018 07:46:26 GMT  
Connection: keep-alive