ãåãã®ããã«ãBlackHatããã«ãŒã®æ»æã®ã»ãšãã©ã¯ãWebã¢ããªã±ãŒã·ã§ã³ãšãµãŒãã¹ã®ãµãŒããŒããŒã¿ã䟵害ããããšãç®çãšããŠããŸãã åæã«ãå°ãªããšãä»æ¥ã¯ã¯ã©ã€ã¢ã³ãåŽãæ»æãããŸãã ãã©ã€å®çŸ©ã«ããã°ãæ»æãšã¯ããããã¯ãŒã¯ãšããŒã¿è»¢éãããŒã¿ãšãã®çœ®æãã€ã³ãã©ã¹ãã©ã¯ãã£ãšWebã¢ããªã±ãŒã·ã§ã³ã®å®è£
ã®æè¡çç¹åŸŽãçã£ãããã«ãŒåŽã®äžé£ã®å¯Ÿçã§ãã ãããã£ãŠãåœéçãªäŒæ¥ã§ã¯ãéçºãšã³ãžãã¢ãã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£ã«å¯ŸããŠãã責任ãããã培åºçãªã¢ãããŒããåãå¿
èŠããããŸãã
ç§ã®ãããžã§ã¯ããäŸã«ãä»æ¥ã®ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã®æ»ææ¹æ³ãšããããã®è
åšãåé¿ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
2013ã2017幎ã®ããã10ã®è
åšãã芧ã®ããã«ãäž»ãªè
åšã®äžã§ããã€ã³ãžã§ã¯ã·ã§ã³ããšã©ãŒããªã¬ãŒãèªèšŒãã€ãã¹ãããã³å®å
šã§ãªãæ©å¯ããŒã¿ãæåã«ãããŸãã æ¢ç¥ã®è匱æ§ãæã€ã³ã³ããŒãã³ãã䜿çšããè
åšã¯äŸç¶ãšããŠé¢é£ããŠããŸãã æ°ããè
åšãç»å ŽããŸãããã¢ã¯ã»ã¹å¶åŸ¡ã¡ã«ããºã ã®ãããã³ã°ãããŒã¿ã®å®å
šã§ãªãéã·ãªã¢ã«åãšã·ãªã¢ã«åãäžååãªè©³çŽ°ãªãã°ãšç£èŠã§ãã
2001幎ãMark CurfyãšDennis Grovesã¯OWASP ïŒOpen Web Application Security ProjectïŒãèšç«ããŸããã ããã¯ãå€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãšã³ãžãã¢ãåå ãããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã®è匱æ§ãšã®éãã«é¢ããçµéšã亀æããããã®åœéçãªãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ãã OWASPã³ãã¥ããã£ã¯ãè匱æ§ããã¬ãŒãã³ã°è³æããã¹ãããã³æ»æãæéããããã®ããŒã«ã«é¢ããæ
å ±ãå«ãå€æ°ã®èšäºã§ããŒã¿ã«ãåããŠããŸãã å®éã®æ»æã«ã€ããŠèª¬æãããã®åŽé¢ãæããã«ããè
åšãé²ãããã«äœãããå¿
èŠããããã説æããŸãã
ãããžã§ã¯ãã«ãšã£ãŠã©ã®ãããªè
åšãå±éºããç解ããã«ã¯ã培åºçã«ãã¹ãããå¿
èŠããããŸãã ãããè¡ãããã«ããããã¯ãŒã¯ã«ã¯ç¹å®ã®è匱æ§ãèªåçã«èå¥ããã¢ããªã±ãŒã·ã§ã³ããã¬ãŒã ã¯ãŒã¯ãããã³ãªã³ã©ã€ã³ãµãŒãã¹ããããŸãã ããŒã«ã«ãã¹ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ãšãã¬ãŒã ã¯ãŒã¯ã®äœ¿çšããå§ãããŸãããŸããéçšäžã®ãããžã§ã¯ãã®ãã¹ãã«ã¯ããªã³ã©ã€ã³ãµãŒãã¹ãè¿œå ããããšãéåžžã«äŸ¿å©ã§ãã

ãã ãããã¹ãããŒã«ãé倧ãªè匱æ§ã«é¢ããã¬ããŒãã§å ±åããªãã£ããšããŠãïŒå¯èœæ§ã¯äœãïŒãããŒãžã§ã³ç®¡çã·ã¹ãã ãžã®æ©å¯ããŒã¿ã®ä¿åãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ãèªèšŒã¡ã«ããºã ããã¹ã¯ãŒãããã·ã¥ã¢ã«ãŽãªãºã ãæ©å¯ããŒã¿ã®æå·åæ©èœãããã³ãã®ã³ã°ã·ã¹ãã ã«åŒãç¶ã泚æãæã£ãŠãã ããWebã¢ããªã±ãŒã·ã§ã³å
šäœãç£èŠããŸãã ãã®å Žåãå®å
šã«ãã¬ã€ããç²ç®çã«èªååãä¿¡é Œããªãæ¹ãè¯ãã§ãããã
Git
ãŸããGitã®æ©å¯ããŒã¿ã«ã€ããŠèª¬æããŸãããã çæ³çã«ã¯ãæ©å¯ããŒã¿ãä¿åããããã«ç§å¯ã®å¥åã®ãªããžããªãå²ãåœãŠãããŸãã ãããããè©Šé転ã®ããã®çµã¿ç«ãŠäžã«ãæ©å¯ããŒã¿ããã«ã¢ãããããã¢ããªã±ãŒã·ã§ã³ã«çž«ãä»ããããŸãã çŸåšãHashicorp VaultãKeywhizãDocker secretsãAzure Key Vaultãªã©ã人æ°ã§ãã
ãããããã®ãããªã¹ãã¬ãŒãžããªãå Žåã¯ã©ãã§ããããïŒ ããŒã«ã䜿çšããŠãããŒãžã§ã³ç®¡çã·ã¹ãã ã®æ©èœãæ¡åŒµããç§å¯ã®ãã¡ã€ã«ããšã³ã³ãŒãããã³é衚瀺ã«ããããšãã§ããŸãã
æåã«æãæµ®ãã¶ã®ã¯ããŠãããŒãµã«BlackBoxãœãªã¥ãŒã·ã§ã³ã§ãã MercurialãGitãªã©ãä»»æã®ããŒãžã§ã³ç®¡çã·ã¹ãã ã§äœ¿çšã§ããŸãã ããã«ãGitã«ã¯git-cryptãšgit-secretã®2ã€ã®æ¡åŒµæ©èœããããŸãã å
¬åŒããã¥ã¡ã³ãã®èª¬æã®èŠ³ç¹ãããæã䜿ãããããããç解ãããããšæãããããã2çªç®ã®äœ¿çšããå§ãããŸãã git-secretãã€ã³ã¹ããŒã«ããããGitãªããžããªã§åæåããå¿
èŠããããŸãã .gitattributesãã¡ã€ã«ã§äœ¿çšãããæ¡åŒµåãæå®ããããšãå¿ããªãã§ãã ããã 次ã«ãã·ãŒã¯ã¬ããã®ã¢ã¯ã»ã·ããªãã£ãæ§æããŸããæ©å¯ããŒã¿ãžã®ã¢ã¯ã»ã¹ãæäŸãããŠãŒã¶ãŒãç¹å®ããŸãã 次ã«ãæ©å¯ããŒã¿ãå«ããã¡ã€ã«ãè¿œå ãã git-secret-hide
ãŸãã git-secret-reveal.
é ããã¡ã€ã«ãååŸã§ããŸãgit-secret-reveal.
brew install git-secret //
git secret init //
git secret tell your@gpg.email  //
git secret add <files...> //
git secret hide  //
git secret reveal  //
Webpack
è
åšãæé€ããå¥ã®æ¹æ³ã¯ãwebpackãæ£ããæ§æããããšã§ãã XSSãXEEãããã³åæ§ã®æ»æããä¿è·ããã«ã¯ãCORSïŒã¯ãã¹ãªãªãžã³ãªãœãŒã¹å
±æïŒããã³CSPïŒã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒïŒããªã·ãŒã®é å®ãæ€èšããå¿
èŠããããŸãã ã©ã¡ãã®å Žåãããããžã§ã¯ãã§äœ¿çšãããŠããç¹å®ã®ã¹ã¯ãªããã®ä¿¡é Œæ§ã確èªããããã«ãããããŒã«åŸãããšãéèŠã§ãã ãã©ãŠã¶ã«ã¯ãç¹å®ã®ãœãŒã¹ã®ä¿¡é Œæ§ããã§ãã¯ããã¡ã«ããºã ããããŸããããšãã°ãCORSãšCSPãæ£ããæ§æãããŠããªãå ŽåãSafariã¯ãã¹ãŠã®ã¹ãããã§èŠåãçºè¡ããŸãã
CORSãšCSPã«æºæ ããã«ã¯ã2ã€ã®æ¹æ³ããããŸãã æåã®æ¹æ³ã¯ãããã¯ãšã³ãã§å¿çããããŒãæ§æããããšã§ãã 2ã€ç®ã¯ãã¡ã¿ã¿ã°ãšå±æ§ãä»ããŠäž¡æ¹ã®ããªã·ãŒãç»é²ããããšã§ãã æ zyãªããã¯ãšã³ãéçºè
ãããŠãåžžã«å¿ãããã»ãã¥ãªãã£ããªã·ãŒã«é¢å¿ããªãå Žåã¯ãåŸè
ã®æ¹æ³ããå§ãããŸãã ã¡ã¿ã¿ã°ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯æã«ããã«ç»é²ã§ããŸãã html-webpack-pluginãhtml-webpack-exclude-assets-pluginãscript-ext-html-webpack-pluginãcsp-html-webpack-pluginãcryptoãªã©ã®ãã©ã°ã€ã³ãããã«åœ¹ç«ã¡ãŸãã ããã«ããããžã§ã¯ãã«ãµãŒãããŒãã£ã®ãªãœãŒã¹ãããå ŽåïŒããšãã°ãCSSã§äœ¿çšãããå€éšãã©ã³ããžã®ãªã³ã¯ãCDNããèªã¿èŸŒãŸãããªãœãŒã¹ãªã©ïŒãwebpack-subresource-integrity-pluginã䜿çšããããšããå§ãããŸãã ãããã£ãŠãã¹ã¯ãªããã«èªã¿èŸŒãŸãããªãœãŒã¹ãä¿¡é Œã§ããããšããã©ãŠã¶ã«ã€ã³ãžã§ã¯ã·ã§ã³ããªããããããå®å
šã§æãªãããŠããªãããšããã©ãŠã¶ã«éç¥ããŸãã ãããŠã誰ããæªæã®ããããŒã¿ããªãœãŒã¹ã«æ³šå
¥ãããããã¢ããããŒããããšããŠãããã®ããã®æºåããããã®ãããªè
åšãããããžã§ã¯ããä¿è·ããå¿
èŠããããŸãã
ãã©ã°ã€ã³ã®ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãäœæãããé åºã«ç¹ã«æ³šæãæããããšæããŸãã é åºã¯æ¬¡ã®ããã«ãªããŸãã
const SHA256 = (str) => CRYPTO.createHash('sha256').update( str, 'utf8').digest('base64'); const sha256Str = SHA256( '' + Date.now() ); [âŠ] new HtmlWebpackPlugin({ filename: 'index.html', template: 'public/index.html' }), new ScriptExtHtmlWebpackPlugin({ custom: [{ test: /\.js$/, attribute: 'nonce', value: 'nonce-' + sha256Str }] }), new HtmlWebpackExcludeAssetsPlugin(), new CspHtmlWebpackPlugin({ 'base-uri': '\'self\'', 'object-src': '\'none\'', 'script-src': ['\'self\'', '\'unsafe-eval\'', '\'nonce-' + sha256Str + '\''], 'style-src': ['\'unsafe-inline\'', '\'self\''] }, { devAllowUnsafe: false, enabled: true, hashingMethod: 'sha256' }), new SriPlugin({ hashFuncNames: ['sha256', 'sha384'], enabled: true }), [âŠ]
次ã«ãã¢ã»ã³ããªäžã«ã <hed>
ã«http-equiv=content-security-policy
ã¡ã¿ã¿ã°ã衚瀺ãããŸãã ãã£ã¬ã¯ãã£ãã¯ãä¿¡é Œã§ããã¹ã¯ãªãããšãªãœãŒã¹ã瀺ãcontent
å±æ§ã«æžã蟌ãŸããŸãã
base-uri
ãã£ã¬ã¯ãã£ãã¯ãã¹ã¯ãªãããCSSãç»åãªã©ãèªã¿èŸŒãããã«äœ¿çšãããããŒã¹URLã瀺ããŸãã
éåžžããªããžã§ã¯ãã¯ããŒãããnone
ããã object-sr
cãã£ã¬ã¯ãã£ãã«none
ãèšå®ãobject-sr
ã
script-src
ãã£ã¬ã¯ãã£ãã¯JSã¹ã¯ãªããã«é©çšãããŸãã
ã¿ã€ãnnce-<hshVlue>
å±æ§ãnnce-<hshVlue>
ç»é²ããããšãå¿ããªãã§ãã ããã ããã«ãããã·ã¥ã¯SHA256ãŸãã¯SHA512ã¢ã«ãŽãªãºã ã䜿çšããŠèšç®ããå¿
èŠããããŸãã
style-src
ãã£ã¬ã¯ãã£ãã«é¢ããŠã¯ããããžã§ã¯ãã«ã¯ç¹æ®æ§ããããŸããã¹ã¿ã€ã«ä»ãã³ã³ããŒãã³ãã䜿çšããŠåã³ã³ããŒãã³ãã®CSSãèšè¿°ããããããçžäºã«åé¢ããŸãã ãã®ãããç§ãã¡ã§ã¯style-src
unsafe-inline
ãšself
ãstyle-src
ã§äœ¿çšãããããã«æå®ããå¿
èŠããããŸããããããªããšãstyled-componentsãèœã¡ãŸãã

script
ã¿ã°ã¯ãèªåçã«nnce-<hshVlue>
ã integrity
ããã³cross-origin
ãŸãã ãªãœãŒã¹ãä¿¡é Œã§ãããœãŒã¹ãããã«ãããŠããããšããã©ãŠã¶ã«äŒããŸãã ãã以å€ã®å Žåããã©ãŠã¶ããªãœãŒã¹ãCSPãŸãã¯CORSã«äžèŽããªããšå€æããå Žåããã®ã¹ã¯ãªãããŸãã¯CSSãã¡ã€ã«ã¯èªã¿èŸŒãŸãããã³ã³ãœãŒã«ã«æ¬¡ã®ããã«æžã蟌ã¿ãŸãã ããã®ã¹ã¯ãªããã«æ³šæããŠãã ãããåæåãããã®è¡ã«åœŒã èŠãŠãããªãã«äœãåé¡ããããŸãïŒã
MDN ãOWASPãããã³W3Cã®ããã¥ã¡ã³ãã«ã¯ãCSPããã³CORSããªã·ãŒãå®æœããããã®ã¬ã€ãã©ã€ã³ãèšèŒãããŠããŸãã ããã«ã䟵å
¥ãã¹ãããŒã«ãããã¯ããããžã§ã¯ãã®CORSããã³CSPã«ãŒã«ãžã®æºæ ãå ±åããŸãã ãããžã§ã¯ãã®èªåãã¹ããå®æœãããã¬ãŒã ã¯ãŒã¯ãŸãã¯ããŒã«ã¯ãæ¬ é¥ãææããŸãã
ãŠãŒã¶ãŒèªèšŒ
OpenID ConnectãšKerberosãããã³ã«ã䜿çšããŸãã å€éšãŠãŒã¶ãŒã®èªèšŒã«ã¯ãããªãäžè¬çãªOpenIDæšæºã䜿çšãããŸãã
Kerberosã¯å
éšãããã¯ãŒã¯ã«ããé©ããŠããŸããéè¡ã§ã¯ãåŸæ¥å¡ã®èªåèªèšŒã«äœ¿çšãããŸãã çµç¹ã®åŸæ¥å¡ãåãããŒã«ã«ãã·ã³ããããšããŸãã 圌ã¯ãã®ãã·ã³ã§äžåºŠèªèšŒãããšãã©ãã«ããŠããã°ã€ã³ãšãã¹ã¯ãŒããå床å
¥åããå¿
èŠããªããªããŸããåŸæ¥å¡ã¯ã¢ããªã±ãŒã·ã§ã³ã«ãã°ã€ã³ããã·ã¹ãã ã¯ããã«èªèšŒããŸãã Kerberosã«ã¯ããŒã«ã«ãã·ã³çšã®åŸ®åŠãªèšå®ããããããã¯åã³ã³ãã¥ãŒã¿ãŒãšåãã©ãŠã¶ãŒã«å¯ŸããŠæ§æããå¿
èŠãããããå°é£ã§ãã Internet Explorerãéåžžããã©ã«ãèšå®ããã«ã¢ããããChromeãIEèšå®ããã«ã¢ããããå ŽåãFirefoxã¯åå¥ã«èšå®ããå¿
èŠããããŸãã MacOS Xã®Safariã¯èšå®èªäœãèŠã€ããŸãããWindowsã®Safariã®å Žåã¯æåã§èšå®ããå¿
èŠããããŸãã
ãã¹ãŠã®ãã©ãŠã¶ãŒã§ãã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«æ©èœãããã©ããã確èªããå¿
èŠããããŸãã ããšãã°ãWindowsã§äœæ¥ããŠããå ŽåãSafariãããŒã«ã«ã«ã€ã³ã¹ããŒã«ããŠãããžã§ã¯ãããã¹ãããMacã§äœæ¥ããŠããå Žåãä»®æ³ãã·ã³ã§Windowsãèµ·åããŠã察å¿ãããã©ãŠã¶ãŒããŒãžã§ã³ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã
èªèšŒã¯ãPassport.jsããã³ãšã¯ã¹ãã¬ã¹ã»ãã·ã§ã³ããã±ãŒãžãAuth0 SDKã䜿çšããŠãææ°ã®ã¢ããªã±ãŒã·ã§ã³ã«å®è£
ã§ããŸãã
OpenID ConnectãŸãã¯ãã®ä»ã®ãããã³ã«ãä»ããŠèªèšŒãµãŒãã¹ãéçºã§ããªãå Žåã¯ãAuth0ãªã©ã®ãããã·ã¬ã€ã€ãŒã䜿çšããŠãã€ã³ã¿ãŒããããªãœãŒã¹ãžã®å®å
šãªã¢ã¯ã»ã¹ããŠãŒã¶ãŒã«æäŸããããšãå°éãšãããµãŒãããŒãã£äŒæ¥ãéããŠèªèšŒãè¡ãããããã«ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãNode.jsã«ã¢ããã°ã¬ãŒããããšãã¯ããµãŒããŒã§Passport.jsããšã¯ã¹ãã¬ã¹ã»ãã·ã§ã³ãªã©ã®ããã±ãŒãžã䜿çšããããšããå§ãããŸãã ã¯ã©ã€ã¢ã³ãã®ã»ãã¥ãªãã£ã確ä¿ããããã«ãèªèšŒçšã®ã³ã³ããŒãã³ããç¬èªã«äžããŸãã ãã©ãŒã ãã£ãŒã«ãã®èªåè£å®ãé€å€ããããã«ãèªèšŒãã©ãŒã ã§autocomplete offå±æ§ãæå®ããããšãå¿ããªãã§ãã ããã
ãã¹ã¯ãŒãããã·ã¥
OWASP Webãµã€ãã§ã¯ãããŒã¿ããŒã¹ã«çµã¿èŸŒãŸããŠãããã¹ã¯ãŒãããã·ã¥ã¡ã«ããºã ã䜿çšããªãããšããå§ãããŸãã ãã®ããã«ã¯ãArgon2ãPBKDF2ãccryptãbcryptãªã©ã®ããã±ãŒãžã䜿çšããããšããå§ãããŸãã ç§ã®ç·Žç¿ã§ã¯ãArgon2ã䜿çšããŸããããã¯GCCãPGP / GPGã¢ã«ãŽãªãºã ãªã©ã®ã©ãããŒã§ãããGCCããã±ãŒãžãæåã«ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã Argon2ã®äœ¿çšã¹ããŒã ïŒ
1. GCC >= 4.8 install $ brew install gcc
2. - $ npm install -g node-gyp
3. Argon2 $ npm install argon2
4. import * as ARGON from 'argon2'; ARGON.generateSalt().then( (salt: string) => { ARGON.hash('some-user-password', salt) .then((hash : string) => { console.log('Successfully created Argon2 hash:', hash);
é£èªå
é£èªåã«ãããã³ãŒããå€æŽããŠã³ã³ããŒãã³ãã«å解ã§ããªãããã«ããããšãã§ããŸãã çµå±ã®ãšãããæ»æè
ã ãã§ãªããæ»æè
ã¯ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ãéåžžã«é »ç¹ã«äœ¿çšããŸããããã°ã©ãã¯äœããã®çš®é¡ã®JSãã¡ã€ã«ãååŸãããœãŒã¹ã®åæãéå§ããŸãã ãããã£ãŠãæªæã®ããã³ãŒããå®è£
ããããã«ãç¹å®ã®ã¹ã¯ãªããã®äœ¿çšæ¹æ³ãåŠç¿ããããäœæ¥ã®ã¡ã«ããºã ãç解ãããã§ããŸãã ãŸãã¯ããããã®ã¡ã«ããºã ã䜿çšããŠWebã¢ããªã±ãŒã·ã§ã³ããããã³ã°ããã¹ãã«ã¹æ»æãå®è¡ããŸãã
ããã«ãŒã¯åé¡ã«ãªããŸããã ãŸãããªãœãŒã¹ã®èª¿æ»ãè¡ããè匱æ§ãšæ»æãã¯ãã«ã決å®ããŸãã ããšãã°ãããŒã¿ãæäœãããããã©ã³ã¹ããŒããããã³ã«ã«å«ãŸããè匱æ§ãæªçšãããããŸãã æ»æãã¯ãã«ã¯ãç¹å®ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®è匱æ§ãæšçã«ããããšãã§ããŸã; UNIXã·ã¹ãã ã«ã¯å€ãã®è匱æ§ããããŸãã ãã ãã管çè
ãã»ãã¥ãªãã£ããªã·ãŒãé©åã«æ§æããŠããªãå ŽåïŒããšãã°ãå€éšãžã®URLãæ£ããæ§æãããŠããªãå ŽåïŒã®ã¿ãè匱æ§ãå©çšã§ããŸãã
ãã®ãããåµå¯ã«ã¯ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã䜿çšãããŸãã å®å
šã«é€å€ããããšã¯äžå¯èœã§ãããéåžžã«é£ããå ŽåããããŸãã ããã«ã¯ãããŸããŸãªé£èªåããŒã«ã䜿çšãããŸããç§ã®å Žåã¯javascript-obfuscatorã§ãã ããã«åºã¥ããŠãwebpackã®ãã©ã°ã€ã³-webpack-obfuscatorãäœæãããŸããã ãŸããwebpackçšã«obfuscator-loaderãäœæãããŸããã ãã®ããã±ãŒãžã«ã¯ãäœãäžãé«ã®ããŸããŸãªã¬ãã«ã®åå·ç
ã«å¯Ÿããæšå¥šèšå®ããããŸãããããã¯å
¬åŒWebãµã€ãã§èŠã€ããããšãã§ããŸãã ãã®é£èªåããŒã«ã䜿çšããå Žåã¯ãwebpackã«çµã¿èŸŒãŸããçž®å°ã¡ã«ããºã ã§ã¯ããŸãæ©èœããªãããšã«æ³šæããŠãã ããã ãããã¡ã€ãšé£èªåãäžç·ã«äœ¿çšããªãã§ãã ããã䜵çšãããšãé£èªåããŒã«ãã¹ã¯ãªããã³ãŒããå®å
šã«ç Žå£ããå¯èœæ§ããããŸãã
ããã«ãé£èªåããŒã«ã¯ãã¹ã¯ãªããã®ããªã¥ãŒã ãšãã®èªã¿èŸŒã¿ãå¢ãããŸãã ããã§ãèªåã§æ±ºå®ããå¿
èŠããããŸããã»ãã¥ãªãã£ãå®å®æ§ãä¿¡é Œæ§ãåäžãããŸãããå©äŸ¿æ§ãšé床ã倱ããŸãã ãŸãã¯é床ãæ°ã«ããŸãããã¬ã€ãã©ã€ã³ã«åŸãããšã«ã€ããŠã¯å®å
šæ§ãå¿ããŸãã
è
åšã®ãã°ãšç£èŠ
æ¢ç¥ã®è匱æ§ãæã€ããã±ãŒãžã®äœ¿çšãªã©ã®è
åšããããŸãã ãã®ãããªç¶æ³ã§ã¯ãnpm auditãSnykãLGTMãªã©ã®è
åšåæããŒã«ã圹ç«ã¡ãŸãã Npm auditã¯npmã«çµã¿èŸŒãŸããŠããæšæºãŠãŒãã£ãªãã£ã§ããããã®ã³ãã³ããåžžã«åŒã³åºãããæŸèæãäœæããå¿
èŠããããŸãã ãããã£ãŠãSnykã䜿çšããããšããå§ãããŸãã ãã®ãããžã§ã¯ãã«ã¯ãè匱æ§ãæã€ç¬èªã®ããŒã¿ããŒã¹ããããŸãã ãã¹ããéå§ãããšãSnykã¯ãã®ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããéšå€è
ãã¢ã¯ã»ã¹ã§ããªãSnykãããžã§ã¯ãã«ã¬ããŒããå
å¯ã«ã¢ããããŒãããŸãã 確ãã«ããããžã§ã¯ããç¡æã§ç¢ºèªã§ããã®ã¯300åã ãã§ãåäºåã³ãããã確èªãããšããããã®300åã®ç¡æè©Šè¡ã¯éåžžã«è¿
éã«çµäºããŸãã ãããã£ãŠãäºåããã·ã¥ãŸãã¯äºåããŒãžããã¯ã®ãã§ãã¯ãå®è¡ããããšããå§ãããŸãã
人éã¯ã©ã®ã·ã¹ãã ã§ãæãéèŠãªè匱æ§ã§ãã ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã®ãã«ããéå§ããåã«ãããžã§ã¯ããå¿
ã確èªããŠãã ããããœãŒã¹ã³ãŒãã«ãæªæã®ãããã®ãå«ãŸããŠããå¯èœæ§ããããŸãã ãããžã§ã¯ãã«ã¢ã¯ã»ã¹ã§ããã®ã¯1人ã ãã§ãããéåžžã¯ããŒã ãšããŠäœæ¥ããŸãã äŒç€ŸããçŸãããèŸããããŒã¯ãæ®ãããšã決ããããçš®ã®ãè³¢æãªäººããçŸãããã©ãã§ããããïŒ ããã念é ã«çœ®ããŠããå¿
èŠããããŸãã
ãããžã§ã¯ãã®æåããSnykããã±ãŒãžã䜿çšããã³ã³ãœãŒã«ããã¹ãã£ã³ãéå§ããããšããå§ãããŸãã ããã§ã¯ãã¹ãŠãç°¡åã§ããã€ã³ã¹ããŒã«åŸãã¢ã«ãŠã³ãã®ãã°ã€ã³ãšãã¹ã¯ãŒããèšå®ãããšããã¹ãèªäœã¯æ¬¡ã®ããã«å®è¡ã§ããŸãã
- npm i snyk âDäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããpackage.jsonã§ãsnykãïŒtrueãæå®ããåŸã次ãå®è¡ããŸãã
./node_modules/.bin/snyk wizard --dev
- package.jsonã§ãã¹ã¯ãªãããšèšå®ãè¿œå ããŸãã
{ ... "scripts": { ... "test": "npm run test:snyk && npm run test:jest", ... "test:snyk": "snyk test --dev", ... "prepare": "npm run prepare:snyk", "prepare:snyk": "snyk protect" }, "husky": { "hooks": { "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", "pre-commit": "npm run test:snyk && npm run lint && npm run test:jest", "pre-push": [ "npm run test:snyk", "npm run lint", "npm run test:jest", "npm run build:production" ], ... } }, "snyk": true }
äžèšã§ã¯ãã»ãã¥ãªãã£ã®è
åšã«é¢ããããŒã«ã«ãã§ãã¯ã確èªããŸããã ããã±ãŒãžã®æ¢ç¥ã®è
åšã確èªããã«ã¯ãLGTMã®äœ¿çšããå§ãããŸãã ãã®ãããžã§ã¯ããGitHubãŸãã¯Bitbucketãšçµã¿åãããŠäœ¿çšââããŠïŒè©ŠããŠã¿ããŸã§ã¯å¿
èŠãããŸããã§ããïŒãããã·ã¥ãããã³ã«ã³ãŒããããã«ãã§ãã¯ãããŸãã
ã¢ããªã±ãŒã·ã§ã³ç£èŠ
ããã³ããšã³ãã®é åã§ã¯ãããŒã«ã¯ãã§ã«ååã«ç¢ºç«ãããŠãããã¯ã©ã€ã¢ã³ãããŒãã®ãã°èšé²ãšç£èŠã«ãããã奜ã¿ã®ããŒã«ãå©çšã§ããŸãã æãæåãªã®ã¯ãSentryãTrackJSãããã³InsightOpsã§ãã SentryãµãŒããŒã¯ããã®ç©çãµãŒããŒã«å±éã§ããŸãã ããšãã°ã2ã€ã®ãããžã§ã¯ãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®åäœããã°ã«èšé²ããããã«å®å
šã«æ§ââæãããå¥ã®ãµãŒããŒã䜿çšããŸããã URLã«ã¢ã¯ã»ã¹ããŠããã¹ãŠã®ãã°ãããã«ããããããŸããã ã¢ããªã±ãŒã·ã§ã³ã§ãšã©ãŒãçºçããå Žåãtry catchãããã¯ã«ã©ãããããravenããã±ãŒãžã¡ãœãããä»ããŠSentryãµãŒããŒã«éä¿¡ãããŸãã ãã¹ãŠãã·ã³ãã«ã§äŸ¿å©ã§ãã ç»é²ããŠããªãSentryã§äžæçãªURLã衚瀺ãããå Žåãåã蟌ã¿ãŸãã¯äžæçãªã¡ãã»ãŒãžã衚瀺ãããå Žåããããã¯ããªãããããã³ã°ããããšããŠããŸãã ç§ã®ç·Žç¿ã§ã¯ãããã¯å®æçã«èµ·ãããŸããã ããšãã°ããããžã§ã¯ãã®1ã€-åºåãããã«ãŒãšã¢ã³ããŠã€ã«ã¹ããã€ãã¹ãããµãŒãã¹-ã¯ã絶ããããã«å¯Ÿæãããããã³ã°ããããšããŸããã
ç£èŠã«ã¯ãGrafanaã®äœ¿çšããå§ãããŸãã ã·ã¹ãã ã«ãã£ãŠç£èŠãããåºæºãšææšã®ã·ã¹ãã ãæ€èšããããšãéèŠã§ãã ãã©ãã£ãã¯ãåºåã®ãªã¿ãŒã³ãã¬ã³ããªã³ã°åºåã®çšåºŠãYandexããã®ãããŒã®æ°ãªã©ã«æ³šç®ããŸããã ïŒã©ã³ãã©ãŒã°ã«ãŒãã®ãããžã§ã¯ãïŒã Yandexã¯ãªã¯ãšã¹ããåŠçããæ¹æ³ãç解ããå¿
èŠããããŸãããããã¯ãµãŒãããŒãã£ã®ãµãŒãã¹ã§ãããããç£èŠãå¿
èŠã§ããã倱æãããšãããžã§ã¯ãå
šäœãå®å
šã«åŽ©å£ããå¯èœæ§ãããããã§ãã
ãµãŒãããŒãã£ã®ãµãŒãã¹ãšã®ãã¹ãŠã®éä¿¡ãç£èŠãããšããšã©ãŒãããã«èŠã€ãããŸãã ç§ã®å®è·µããã®è©±ïŒYandexãããåºåã®è¿ä¿¡ãçªç¶åæ¢ããããšãããããŸããã æè¡çãªäžå
·åããããåºåãããã¯ãŒã¯å
šäœãç·å¯ã«åæ¢ããããšãå€æããŸããã ãããŠãYandexãæåã«ç§ãã¡ã«ç¥ãããã®ã§ã¯ãããŸããã§ããããç§ãã¡ã¯åœŒãã«é»è©±ãããŠã圌ãã®ãµãŒãã¹ã§äœãèµ·ãã£ãŠããã®ãã圌ãã«å°ããŸããã
ç£èŠããæè¯ã®æ¹æ³ã¯äœã§ããïŒ å°ããªURLãååŸããGETãã©ã¡ãŒã¿ãŒãèšè¿°ããŠããã®URLã«GETãªã¯ãšã¹ããéä¿¡ããŸãã ãµãŒããŒåŽã§ããã®URLãåŠçãããã°ãããŒã¿ããŒã¹ã«æžã蟌ã¿ãç£èŠãGrafanaã«äžããŸãã ãã¹ãŠãã·ã³ãã«ã§ãã
ããã ãã§ã å°æ¥çã«ã¯ãWebã¢ããªã±ãŒã·ã§ã³ãè
åšããä¿è·ãããšãããããã¯ã«ã€ããŠåŒãç¶ãå·çããŠãããŸãã æåŸãŸã§èªãã ãã¹ãŠã®äººã«-ããªãã®ãããžã§ã¯ãã®å®å
šãé¡ã£ãŠããŸãïŒïŒïŒ
ãããã¯ãèªãããã®ãœãŒã¹ã®ãªã¹ãïŒ
www.owasp.org/index.php/Main_Page
tproger.ru/translations/webapp-security
S.ããŒã¯ã¹ã ããã«é«éãªåäžããŒãžã¢ããªã±ãŒã·ã§ã³ïŒã»ãã¥ãªãã£
ã·ãŒã³ãŒãããããŒãC. CERT Cã»ãã¥ã¢ã³ãŒãã£ã³ã°æšæº/ãããŒãC.ã·ãŒã³ãŒãã -2008
ãã§ã¿ã³ã»ã«ã©ã³ãã ããŒãã¢ããªã±ãŒã·ã§ã³ã®ä¿è·-2017
ã¹ãã£ãŒãã³ã»ããŒããŒã Webã¢ããªã±ãŒã·ã§ã³ã®è匱æ§ã®æ€åºãæªçšãé²æ¢-2011
ãããŒãã»ã·ã¢ã³ã¹ããŒãã·ã§ãŒã³ã»ãã£ãªããã»ãªãªã€ãã ã¯ã©ã€ã¢ã³ãåŽã®æ»æãšé²åŸ¡-2012
ããŒã«ã¹ãã³ããããã£ããã·ã¥ãã¥ãã¿ãŒãã Web Application Hacker's HandbookïŒã»ãã¥ãªãã£ã®æ¬ é¥ã®çºèŠãšæŽ»çšã第2ç-2011
ã«ãŒã«ãã¥ãã Node.js Webã¢ããªã±ãŒã·ã§ã³ãä¿è·ãã-2015