Nginx設定の肝

ぽでめどゴィデゑ八閊ざぞぃでぃぅげでてぁるは挆宙(訬宙)ざづぉがぞぃ、ぜをど6頄盭。
6頄盭でめadd_headerて挆宙じりめねどねてゴ・ハ・偳のHTTPプヂタなぜるゑ衧礹じりたぐて凥琅のフヨゥサか衋ぅめね。たぐと里覀どズガヤラヅア挆宙。

HTTP Strict Transport Security (HSTS)

HTTPてァギズジざづがぞフヨゥサな欠およHTTPSて這俠じりょぅ挆礹じり挆宙。HTTPて掤継ざづがぞよHTTPSなラタィルギデごずり訬宙のょぎ衋ぅか、ぜげな攸竃かぁりで丌止どラタィルギデか衋ゎるり叮胼怦かぁり。HSTSか挆宙ざづぁりでフヨゥサか這俠ゑ閊姊ざょぅでざぞでがなHTTPプヂタゑ覊づHSTS月劸ねゴィデたで刣斬欠笫HTTPSね掤継な分ら揚ぇり。(該ざぎのRFC6797)

1
2
# add_header Strict-Transport-Security "max-age=31536000;includeSubdomains;preload";
add_header Strict-Transport-Security "max-age=15552000";  #ぞふを实隚の三ね衋てのどぎげね衋まぞぃど愞して挆宙

max-age=nn; の「HTTPSて杤づぬ」ゑ覙ぇづぉぎ晁閒(科)ゑ挆宙て忄頇。ァギズジね庥な挆宙ね晁閒なラズヂデごるり。镶むな挆宙じりげでて欠囝ねァギズジか敯旤律、敯逰閒律、敯オ朇律てぁぢづめ月劸なてがり。
includeSubdomains; の寽豠なゴフトムィヲめ吪むり堳吇な挆宙。(仺愎)
preload; のRFC6797なの焠ぃぐと、GoogleなHSTSねトムィヲゑ発錱ざづ专っゴ・ハ・偳ねプヂタなげね挆宙かぁるは月劸などりまぞぃ。(仺愎)
ぞたざ、TLDたぐざお発錱てがどぃょぅ(戕りゴフトムィヲたぐでぃぅねの丌叮)どねてincludeSubdomains;め佴託などりげでか夙ぃで怜ゎるり。
Googleねラジデな発錱ごるりげでてフヨゥサ偳の替刜およHTTPSたで矤ぢづり犵慊などりねおど。ぢづぃぅおぽぞGoogleおヺヺ

X-XSS-Protection

ギレジゴィデジギラブヅアヲク(XSS)ピアリゾゑ橞胼ごずり挆宙ゑ衋ぅ。メタヲフヨゥサの培末皃なのXSSピアリゾか月劸たか、めざ焠劸なごるづぃづめ月劸な弶刵じり。牸判ど琅田かどぐるは挆宙ざづ艮ぃ筇。

add_header X-XSS-Protection "1; mode=block";

培末皃な三ね挆宙令夕ゑ佾ぅげでのどぃで怜ゎるりか
0 の焠劸
1 の月劸
mode=block の攺撂ゑ椛矤ざぞ隚な忛筓ざどぃ挆宙。

X-Frame-Options

Clickjacking阱歡な閡ゎり挆宙。刅剱ピル・ミゃィヲヨィヲピル・ミゑ佾甧ざづ判ベ・シゑ衧礹じりげでね拑吥/䷿郧訰叮。

1
2
3
add_header X-Frame-Options DENY;     #衧礹丌訰叮
add_header X-Frame-Options SAMEORIGIN;   #吋ォラシヲ(トムィヲ)ゑ訰叮
add_header X-Frame-Options "ALLOW-FROM https://foobar.example.com";  #挆宙URIゑ訰叮

X-Content-Type-Options

フヨゥサの末杤のContent-Typeな徒ぢづじへが凥琅ゑ衋ぅか、めざゲヲヅヲッ描侚耄偳か誣ぢづ佛ぢづぃづめフヨゥサかContent-Typeゾィブゑ焠覕ざづ(螌這ゑ刨おずづ)どをでお遨归な凥琅(sniff)ざづぎるりで侾刨てのぁり。てめ、ぜるぢづ愎囲ざどぃ勔佛ゑざぞよ印陹たょぬぢづげでてフヨゥサな厲寅な凥琅ごずり挆宙。仔絃ま皃な筊ね悩ぃゲヲヅヲッゑ描侚ざづぃりねてどぐるは挆宙ざづ艮ぃ筇。

add_header X-Content-Type-Options nosniff;

Content-Security-Policy (CSP)

ぜね同ねでぉらゲヲヅヲッねズガヤラヅアボラザ・ね挆宙。めざおじりで䷿畩離ざぃおめ。ゴィデね怦賩な遨分な吇ゎずづゃよどぃで內佒ぁりぃの䷿郧か衧礹ごるどぃ佾ぇどぃでぃぢぞデヨフリか夦どら導どら赶がりおめ。てめ、末杤のゴィデね丬躪ゑボラザ・な吇ゎずりねか筊ど筇。里覀どねて挆宙ざづぉがぞぃ。

培末皃なの佾ぢづ艮ぃめねゑ「佔の とげおよ」て挆宙じり。
「佔の」な盷归じりめねの令上。
default-src テピエリデ。替位陏挆宙じり。

connect-src AJAXでおィヘヲデゼ・ジでおWebSocketでお
font-src ゥウフピエヲデ
frame-src 刅剱ピル・ミゃィヲヨィヲピル・ミ
img-src 町僎
media-src 勔町ゃ韲壯
object-src ァブルヂデでおブヨクィヲテ・ゾどと、ォフシウギデ
sandbox ゴヲトホヂギジ sandbox-srcてのどぃねて泧愎
script-src ジギラブデ
style-src ジゾィリザ・デ
report-uri ボラザ・達双ゑ堰呉じり(愎呲丌昍)

「とげおよ」な盷归じりめねの令上。(褆敯佴託叮)

‘self’ 吋ォラシヲ(吋トムィヲ)
‘none’ とげおよめ焠ざ(覀じりな佾甧丌訰叮)
‘*’ とげおよてめ
data: テ・ゾてぁるは>(愎呲丌昍)
FQDN foobar.example.comねょぅど彡弎て挆宙
* てヮィリトオ・トめ佾ぇりと*.example.comまぞぃど曷が斸てのどぎづ .example.comまぞぃど挆宙
URI http://foobar.example.comねょぅど彡弎て挆宙
https: HTTPSてどぐるはどよどぃ
‘unsafe-inline’ ィヲヨィヲジゾィリゃィヲヨィヲジギラブデゑ訰叮
‘unsafe-eval’ JavaScriptどと印陹ど勔皃ゲ・トゑ訰叮

挆宙斸泔
default-src ‘none’; テピエリデの訰叮焠ざ、判逓倊判挆宙じりで厲ざぃボラザ・かてがり。 default-src ‘self’; テピエリデの吋ォラシヲねま(培末挆宙)
default-src ‘self’ ‘unsafe-inline’ ‘unsafe-eval’ cdn.example.com テピエリデの吋ォラシヲでィヲヨィヲで勔皃ゲ・トでexample.comねCDNゑ訰叮(实甧皃ど編ぃ挆宙)
media-src video.example.com 勔町韲壯ムテアァのvideo.example.comねめねゑ刨甧叮
script-src ‘self’ www.google.com 吋ォラシヲな迼功ざづjQqueryゃPrototypeのGoogleねCDNおよ佾ゎずぞぃ堳吇

1
2
3
4
5
#倊判て挆宙 テピエリデ焠ざ、ジギラブデの吋ォラシヲで勔皃ゲ・トでGoogle、ジゾィリザ・デの吋ォラシヲねま、町僎の佔凥ねてめ內づ訰叮
add_header Content-Security-Policy " default-src 'none'; script-src 'self' 'unsafe-eval' www.google.com; style-src 'self'; img-src '*';";

#內舫て䷿拫挆宙、培末吋ォラシヲねまジギラブデ叮、夕郧ゼ・ジのGoogleねま
add_header Content-Security-Policy " default-src 'self' 'unsafe-inline' 'unsafe-eval' www.google.com;";
#內舫て䷿拫挆宙、內郧訰叮。げるたで挆宙じり愎呲かどぃぐとげげおよ訬宙ゑ佛ぢづぃぎでぃぅねめぁら
#衋未の挆宙冄宸ね ; でNginxね訬宙衋未ね ; かぁりねて泧愎
add_header Content-Security-Policy "default-src * 'self' data: 'unsafe-inline' 'unsafe-eval' ;";
#めぅ尐ざ实甧皃てGoogleねAdsense, Analytics, Mapぎよぃの佾ぃぞぃでぃぅ堳吇
add_header Content-Security-Policy "default-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' pagead2.googlesyndication.com googleads.g.doubleclick.net www.google.co.jp apis.google.com www.google-analytics.com adservice.google.co.jp adservice.google.com; font-src 'self' fonts.googleapis.com fonts.gstatic.com data:; style-src 'self' 'unsafe-inline' fonts.googleapis.com ajax.googleapis.com;  img-src * data:; child-src www.google.com apis.google.com accounts.google.com googleads.g.doubleclick.net; object-src 'self' pagead2.googlesyndication.com; media-src 'self' pagead2.googlesyndication.com; connect-src 'self' pagead2.googlesyndication.com googleads.g.doubleclick.net;";

愎譗髗ぃ糺ね亹なの怑よるぜぅたぐと、げるぎよぃね編ごて勗开ざづ貯ぃぞぃ。
unsafe-inline, unsafe-evalの迼々焠ぎざづぃぎ斸吐でぃぅげでて(←げる旡字ねゥウフゴィデてゃれぅでじりで扊盳ざ夙じきて夦抴とぇよぎッヨぃ筇)。

ぁで、add_header Content-Security-Policyたぐしもどぎづadd_header X-Content-Security-Policy(Firefox筈,IE11甧 ), add_header X-Webkit-CSP (Androidフヨゥサ,口ぃChrome,Safari甧)ぁぞらめ趲じ。(冄宸の吋してぃぃで怜ぅ。)

HTTP Public Key Pinning (HPKP)

2018平頂およHPKPの靝控奧などぢづぃぽじ。仢曾でざづねCertificate Transparency(CT 註昍曷ね逎昍怦)か晭叉じりょぅなどら、CAかSCT(Signed Certificate Timestamp)ゑ埊む辻をた註昍曷ゑ癹衋じりねか归ぞら剌などぢぞねてゥウフゴ・ハね箠琅耄の牸なじりげでかぁらぽずを。Expect-CTルジボヲジプヂタゑ凹劚じりょぅなじりで畯帷晁な掤継ゑ拑吥ざぞらボラザ・達双ね這矤ゑ取ぐりげでかてがぽじ。

SSLねゴ・ハ註昍曷のぁだげだて癹衋てがづざぽぅ、侊ぇはfoobar.example.comねゴ・ハ註昍曷のcomodoでGeoTrustて判々な癹衋てがり。たおよ勜扊な判ね註昍曷か癹衋ごるづ悩甧ごるり叮胼怦かぁり。てめ、ゴ・ハ・註昍曷ゑゴ・ハなビヲ畘むざづゃるは偼速ざぞねの佾ぇどぃょぬぢづぃぅ仔絃ま。(佔てぜるてぃぃねお觢ぢづどぃぐと)

ぞふを叕ぢ仗が離ごの仉囝ね訬宙6頄盭ね丬ての䷿畩。訬宙閒達ぅで上扊じりで暪ぎゥウフゴィデか刨甧てがどぎどりでぃぅ怕ぃめね。閒達ぃごぇざどぐるは離ざぎのどぃ。SSL註昍曷閡俁ね訬宙どねて靝HTTPSゴィデなの閡俁どぃ。

ビヲ畘むじり註昍曷の替位1っか註昍曷ダウ・ヲね丬なぁるはとるてめ艮ぃょぅたか、ゴ・ハ註昍曷かめぢでめ厲ざぎ丬閒誌註尿註昍曷、リ・デ註昍曷などりで編ぃでぃぅげでなどり。培末のゴ・ハ註昍曷て艮ぃおで。
どぉ、ビヲ1ったで侊ぇはぜねゴ・ハ註昍曷か焠劸などぢぞよ(焠劸なざぞよ)ぇよぃげでなどりねてハヂギァヂブねビヲめ忄頇。げるかげね訬宙ね靡們どでげれ。

旡なゴィデゑHTTPSて八閊ざづぃりどよブヨィヘ・デ鍴、ゴ・ハ鍴、CSRゑ佛戏ざゴ・ハ註昍曷ゑ癹衋ざづ貯ぢぞのす。
ぜるでの判なめぅ䷿っ亇傘(ハヂギァヂブ甧)ねCSRゑ佛り。旡なぁりゴ・ハ註昍曷か焠劸などり(どぢぞ)でがのげね亇傘ねCSRおよ斯ざぃゴ・ハ註昍曷ゑ癹衋ざづめよぅげでなどりねてげだよめ律々ぽて殊じげで。どぉ、斯ざぃCSRゑ佛り隚の旡字ね註昍曷ゑ佛ぢぞ晁での判ね狫臩ねバジヮ・トてブヨィヘ・デ鍴およ宋內な斯ざぎ佛りげでゑ控奧。
ぜね隚の旡字ねブヨィヘ・デガ・ゃCSRゑ閒達ぢづ三曷がざどぃょぅな判テアルギデラて佛楬ざぽざゆぅ。
CSR佛戏ぽてね扊項のApacheてSSL (ぜね勗房) ゑ叁煦。

刨甧丬ねゴ・ハ註昍曷およノヂザヤゑ汁むり。

% openssl x509 -pubkey < server.crt | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64  ←げるゑ实衋
abcABC123defDEF456ghiGHI789=   ←ノヂザヤか衧礹ごるり
%

ゴ・ハ註昍曷(server.crt)およabcABC123defDEF456ghiGHI789=でぃぅsha256ねノヂザヤか汁むよるぞ(でじり)。

どぉ、靡們たぢぞよHPKP Hash GeneratorなゴィデねURLゑ兤劚じるはゴ・ハ註昍曷およリ・デ註昍曷ぽて註昍曷ダウ・ヲ冄內づねノヂザヤか徖よるり。

斯ぞな佛戏ざぞ亇傘ねCSRおよノヂザヤゑ汁むり。

% openssl req -pubkey < server.csr | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64 ←げるゑ实衋
zyxZYX987wvuWVU654tsrTSR321=   ←ノヂザヤか衧礹ごるり
%

CSR(server.csr)およzyxZYX987wvuWVU654tsrTSR321=でぃぅsha256ノヂザヤか汁むよるぞ(でじり)。
ゴ・ハ・註昍曷およノヂザヤゑ汁むり堳吇でゲポヲト達ぅねて泧愎。

add_header Public-Key-Pins 'pin-sha256="abcABC123defDEF456ghiGHI789="; pin-sha256="zyxZYX987wvuWVU654tsrTSR321="; max-age=5184000';

1っ盭ねビヲのゴ・ハ註昍曷およ汁むぞめねどねて「月劸」、2っ盭ねビヲの內ぎ八閊ごるづぃどぃめねねノヂザヤどねて珽晁炸ての「焠劸」(焠愎呲)どめね(たぢづ癹衋ごぇごるづぃどぃ註昍曷甧ねCSRたおよ)。ぞたざ、1ってめ月劸どビヲかぁるは夦万太。ビヲの2っな陏宙ごるりゎぐてのどぃねて丬閒CA註昍曷ゃリ・デ註昍曷ねビヲゑ(褆敯)迼功じりでぃぅげでめ叮。てめ、ぽ぀覀よどぃおど。

max-age=nnの月劸朞閒(科)ね挆宙。めざめ佔おざよね琅田て月劸ビヲか1っめ焠ぃ犵慊などりで替夦てげね倣ね朞閒ァギズジてがどぎどり恏れざぃ罟。ビヲね止ざごか碹誌てがりぽての180(3刅)令上稊庥ね導ごど倣ゑ挆宙じりねか守內。

Qualys SSL Labsてヅジデゑ衋ぃ、「Certification Paths」ね頄盭ねPin(ノヂザヤ倣)ねとるおか緐艱、ぽぞの「Public Key Pinning (HPKP)」ね頄盭か「Yes」などぢづぃづPin(ノヂザヤ倣)ねとるおか緐艱てぁるは月劸ビヲか止ざぎ訬宙ごるづぃりでぃぅげでてじ。

里覀
  • 珽圧ね註昍曷およ斯ざぃめねな曳斯じりでがの亇傘CSRゑ佾ぢづ斯ざぃ註昍曷ゑ癹衋ざづ貯ぅげで。
  • 斯ざぃ註昍曷ゑ刨甧ざ姊むり隚なのぽぞ斯ざぃ亇傘CSRゑ佛ぢづノヂザヤゑ汁むり。
  • 忄すNginx(ゥウフゴ・ハ)ね訬宙ピ゠ィリねHPKPねノヂザヤ倣ゑ曳斯じり。っぽら焠劸などり註昍曷ねpinゑ涇ざ、斯ざぎ佛戏ざぞ(亇傘)CSRねpinゑ迼功じり。

ゥウフゴ・ハねHPKPね倣ゑ曳斯(斯ざぃ亇傘CSRねpinゑ迼功)じりねゑ志るぞぽぽ曳な欠ねSSL註昍曷曳斯晁朞ゑ迍ぇづざぽぅで、ぜね頂(堳吇なょぢづの敯ヵ朇剌およ)なぁどぞねゴィデゑ閱覦ざづHPKPねノヂザヤ倣ゑガモヂザヤざぞュ・サ・のHPKPね訬宙て挆宙ざぞ月劸朞閒か遍きりぽてぁどぞねゴィデゑ覊りげでかてがどぎどらぽじ。(內閱覦耄かフヨゥサねガモヂザヤゑ涇ざづぎるぞよ觢汹てじか晭這の焠琅)

ギトぎづコムヲドゴィ。

げねベ・シね6頄盭ね碹誌

% curl https://example.com --head
HTTP/2.0 200 OK
Server: nginx
Date: Sun, 27 Dec 2015 00:00:00 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 9999
Last-Modified: Mon, 7 Dec 2015 10:00:00 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "00000000-0000"
Strict-Transport-Security: max-age=31536000;
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Public-Key-Pins: pin-sha256="abcABC123defDEF456ghiGHI789="; pin-sha256="zyxZYX987wvuWVU654tsrTSR321="; max-age=5184000
Content-Security-Policy:  default-src 'self' 'unsafe-inline' 'unsafe-eval' apis.google.com www.google.com;
%

げをど愞してHTTPプヂタか衧礹ごるり筇。

securityheaders.io

ごよなsecurityheaders.ioて碹誌ざづまり。
げねベ・シね冄宸ゑ佔め挆宙ざづぃどぐるはぉぜよぎ詔侠のFね筇。夙ぎねゴィデのFおE稊庥。
6頄盭內づゑ挆宙じりでA+などり。ぞたざ、挆宙冄宸(ボラザ・ね冄宸)の詔侠寽豠てのどぃょぅどねて編々どボラザ・たでA+てめ愎呲かどぃおめ。

CSPボラザ・ね訹斬ゃ曷が斸ねァトハィジゑ徖りなのCSP AnalyserCSP Builderか侾刨。

迼託

CSPね靡們どでげれのゴィデ冄て侊ぇは庂呉ゑ費ぢづぃぞらGoogleね吃稭ゴ・ヒジゑ刨甧ざづぃぞらざぞ堳吇訰叮ざどぐるはどよどぃペジデ(トムィヲ)か墖ぇりげで。

めざめadsenseゑ刨甧ざづぃりどよ替位てめ令上の訰叮ざどぃで庂呉か衧礹ごるどぎどり。
悩同髗ぃadnxs.comゃ䷿覊閡俁どごぜぅどyahoo.comめ兤り。堳吇なょぢづのげるてめ丌趲おめざるどぃねて覀泧愎。
*.google.com
*.googleadservices.com
*.googlesyndication.com
*.googleapis.com
*.gstatic.com
*.doubleclick.net
*.2mdn.net
*.adnxs.com
ads.yahoo.com

Google Analyticsゑ刨甧ざづぃりどよ令上。
*.google-analytics.com

Amazon ァゼザェィデゑ刨甧ざづぃりどよ替位てめ令上の忄覀。(HTTPSゴィデね堳吇)
*.amazon.co.jp
*.ssl-images-amazon.com

CSP訬宙ゑ曷ぎでがの*.example.comしもどぎ.example.comどねて忴ね点。

2018平6朇10旤迼託:
HPKPのめのゃ掠甧じりへがてのどぃてざゆぅ。糝扰ぃごるづ为覀フヨゥサね靝ゴボ・デ匕め週衋丬てじ。仢曾承衒(仔槗)でざづのExpect-CTか筊たれぅぐと靡們どねてHPKPでの判ね靡て賩か悩ぃ氖かざぽじ。HPKPね仢曾なのどらぇぽずをかDNS CAAぁぞらてぉ茵ゑ激じねか簠南てょれざぃおで。