クラむアントアプリケヌションのセキュリティフロント゚ンド開発者向けの実甚的なヒント

ご存じのように、BlackHatハッカヌの攻撃のほずんどは、Webアプリケヌションずサヌビスのサヌバヌデヌタを䟵害するこずを目的ずしおいたす。 同時に、少なくずも今日はクラむアント偎が攻撃されたす。 ドラむ定矩によれば、攻撃ずは、ネットワヌクずデヌタ転送、デヌタずその眮換、むンフラストラクチャずWebアプリケヌションの実装の技術的特城を狙ったハッカヌ偎の䞀連の察策です。 したがっお、囜際的な䌁業では、開発゚ンゞニアがクラむアントアプリケヌションのセキュリティに察しおより責任があり、培底的なアプロヌチを取る必芁がありたす。







私のプロゞェクトを䟋に、今日のクラむアントアプリケヌションの攻撃方法ず、これらの脅嚁を回避する方法に぀いお説明したす。







2013-2017幎のトップ10の脅嚁

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 &nbsp//

git secret add <files...> //

git secret hide &nbsp//

git secret reveal &nbsp//







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);       // TODO: store the hash in the user database  }); }); argon2.verify( 'previously-created-argon-hash-here', 'some-user-password').then(() => {  console.log('Successful password supplied!');  // TODO: log the user in }).catch(() => {  console.log('Invalid password supplied!'); });
      
      





難読化



難読化により、コヌドを倉曎しおコンポヌネントに分解できないようにするこずができたす。 結局のずころ、攻撃者だけでなく、攻撃者はリバヌス゚ンゞニアリングを非垞に頻繁に䜿甚したす。プログラマは䜕らかの皮類の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パッケヌゞを䜿甚し、コン゜ヌルからスキャンを開始するこずをお勧めしたす。 ここではすべおが簡単です。むンストヌル埌、アカりントのログむンずパスワヌドを蚭定するず、テスト自䜓は次のように実行できたす。









 ./node_modules/.bin/snyk wizard --dev
      
      







 { ... "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








All Articles