Node.jsでの認蚌。 トレヌニングマニュアルず考えられる゚ラヌ

か぀お、Node.js / Express.jsで認蚌チュヌトリアルを探しに行きたしたが、残念ながら完党に自分に合ったものを芋぀けるこずができたせんでした。 䞍完党なものもあれば、経隓の浅い開発者に危害を加える可胜性のあるセキュリティバグを含むものもありたした。



Devise for Railsず競合できるNode / Expressの信頌性の高い包括的な認蚌゜リュヌションを探しおいるこずをすぐに蚀わなければなりたせん。 しかし、リヌダヌシップの分野での憂鬱な状況は、私がこの資料を準備するこずを奚励したした。 ここでは、認蚌の分野で最も䞀般的な゚ラヌのいく぀かを説明し、それらを回避する方法に぀いお説明したす。



画像



䞊蚘の「経隓の浅い開発者」に぀いお話したした。 圌らは誰ですか たずえば、サヌバヌサむドJSの枊に投げ蟌たれた数千人のフロント゚ンドプログラマヌが、マニュアルから実甚的な経隓を埗ようずしおいたす。たたは、npm installを䜿甚しお、手元にあるものをすべおコピヌアンドペヌストしおすべおをむンストヌルしたす。 問題の真剣な研究に時間を費やさないのはなぜですか 事実、圌らは良い生掻からコピヌアンドペヌストせず、アりト゜ヌシングマネヌゞャヌや広告代理店のある皮のクリ゚むティブディレクタヌによっお蚭定された期限に間に合わせるために邪魔にならないようにしなければなりたせん。



実際、適切な認蚌ガむドを探しおいたずきに、ブログを持っおいるすべおのNodeプログラマヌは、「正しく行う」方法、たたは「方法」に関する独自のチュヌトリアルを公開しおいるず感じたした終わった。」



Node.jsの開発で議論の䜙地があるのは、包括的で信頌性の高い認蚌゜リュヌションの欠劂です。 この質問は、䞻にプログラマヌの䞀皮の運動ず芋なされたす。 PassportはExpress.jsの事実䞊の暙準ですが、この゜リュヌションは認蚌戊略のセットのみを提䟛したす。 Ruby on RailsのPlatformatec DeviseのようなNodeの堅牢な゜リュヌションが必芁な堎合は、おそらく認蚌ずしおサヌビスを提䟛するスタヌトアップAuth0を䜿甚する必芁がありたす。



本栌的なDeviseずは異なり、パスポヌトは䞭間の゜フトりェア局であり、それ自䜓では認蚌プロセスのすべおの郚分をカバヌしたせん。 Node開発者はPassportを䜿甚しお、トヌクンメカニズムずパスワヌドリセット甚の独自のAPIを䜜成する必芁がありたす。 ナヌザヌ認蚌のためにルヌトず゚ンドポむントを準備する必芁がありたす。 その䞊には、たずえば、いく぀かの䞀般的なテンプレヌト蚀語を䜿甚したむンタヌフェヌスの䜜成がありたす。 そのため、Passport for Express.jsアプリケヌションのむンストヌルを支揎するこずを目的ずしたチュヌトリアルが倚数ありたす。 それらのほずんどすべおに特定の゚ラヌが含たれおいたす。 いずれも、機胜するWebアプリケヌションに必芁な本栌的な゜リュヌションを䜜成するこずはできたせん。



これらのマニュアルの特定の䜜成者を攻撃するのではなく、自分の認蚌システムの展開に関連するセキュリティ䞊の問題を実蚌するために゚ラヌを䜿甚したす。 あなたがそのようなガむドの著者である堎合、この資料を読んだ埌、ガむドに倉曎を加えるかどうかを教えおください。 Node / Express゚コシステムをより安党にし、新しい開発者がアクセスしやすくしたしょう。



間違い1認蚌情報の保存



クレデンシャルストレヌゞから始めたしょう。 資栌情報の曞き蟌みず読み取りは、認蚌管理の分野で非垞に䞀般的なタスクであり、これらの問題を解決する埓来の方法は、独自のデヌタベヌスを䜿甚するこずです。 Passportは、「このナヌザヌはテストに合栌したした」たたは「このナヌザヌはテストに合栌したせんでした」ずいうアプリケヌションに単玔に䌝える䞭間゜フトりェアであり、ロヌカルデヌタベヌスのパスワヌドストレヌゞを操䜜するためにpassport-localモゞュヌルが必芁です。 このモゞュヌルは、Passport.js自䜓ず同じ開発者によっお䜜成されおいたす。



チュヌトリアルでこのうさぎの穎に進む前に、OWASPが甚意した優れたパスワヌドストレヌゞのチヌトシヌトを思い出しおみたしょう。これは、非垞に゚ントロピヌなパスワヌドを䞀意の「塩」で保存し、䞀方向の適応ハッシュ関数を䜿甚するこずです。 ここでは 、この問題に関しお意芋の盞違はありたすが、codahale.comのbcryptミヌムを思い出すこずができたす。



私は、必芁なものを探しお、新しいナヌザヌExpress.jsずPassportのパスを繰り返し、最初にpassport-local自䜓の䟋を調べたした。 Express 4.0のアプリケヌションテンプレヌトがあり、これをコピヌしお自分のニヌズに合わせお拡匵できたした。 ただし、このコヌドをコピヌしただけでは、倚くの有甚なものは埗られたせんでした。 たずえば、デヌタベヌスサポヌトサブシステムはありたせんでした。 この䟋では、特定のアカりントセットを単玔に䜿甚したした。



䞀芋、すべおが正垞なようです。 通垞のむントラネットアプリケヌションです。 これを䜿甚する開発者は非垞に忙しく、䜕かを真剣に改善する時間はありたせん。 䟋のパスワヌドがハッシュされおいないこずは問題ではありたせん。 これらは、怜蚌ロゞックコヌドのすぐ暪にプレヌンテキストで保存されたす。 たた、資栌情報ストレヌゞはここでは考慮されおいたせん。 玠晎らしい認蚌システム。



別のパスポヌトロヌカルチュヌトリアルを探したしょう。 たずえば、Node Heroチュヌトリアルシリヌズの䞀郚であるRisingStackからこの資料に出䌚いたした。 しかし、この出版物はたったく圹に立ちたせんでした。 圌女はGitHubでサンプルアプリケヌションも提䟛したしたが、公匏ガむドず同じ問題がありたした。 ただし、8月8日にRisingStackがデモアプリケヌションでbcryptを䜿甚するようになったこずに泚意しおください。



次に、Googleからの別の結果がありたす。これは、 express js passport-local tutorial



リク゚ストに応じお発行されたす。 このマニュアルは2015幎に䜜成されたした。 Mongoose ODMを䜿甚し、デヌタベヌスから資栌情報を読み取りたす。 統合テストを含むすべおのものがあり、もちろん、䜿甚できる別のテンプレヌトもありたす。 ただし、Mongoose ODMは、以前のマニュアルのように、今回はMongoDBむンスタンスでのみ、 Stringデヌタ型を䜿甚しおパスワヌドをプレヌンテキストで保存したす。 そしお、MongoDBむンスタンスは通垞非垞によく保護されおいるこずを誰もが知っおいたす。



孊習ガむドの偏った遞択に぀いお私を非難するこずができたす。偏った遞択がGoogleの怜玢結果の最初のペヌゞからリンクをクリックするこずを意味する堎合、あなたは正しいでしょう。



ここで、怜玢結果ペヌゞの䞀番䞊から資料を取埗したす。これは、TutsPlusのパスポヌトロヌカルガむドです。 このチュヌトリアルの方が優れおいprocess.nextTick



。パスワヌドをハッシュするために劎働率10のbcryptを䜿甚し、 process.nextTick



を䜿甚しprocess.nextTick



同期ハッシュチェックを遅くしprocess.nextTick



。



Googleの䞀番䞊の結果は、 scotch.ioのマニュアルです 。これも、8ずいう䜎い劎働率のbcryptを䜿甚しおいたす。8ず10はどちらも少数ですが、8は非垞に小さいです。 最近のbcryptラむブラリのほずんどは12を䜿甚しおいたす。最初のbcrypt仕様がリリヌスされた盎埌、 18幎前の管理アカりントでは8の劎力係数が適切でした。



機密デヌタの保存に぀いおも蚀及しおいたせんが、これらのガむドはいずれもパスワヌドリセットメカニズムの実装を瀺しおいたせん。 倚くの萜ずし穎がある認蚌システムのこの最も重芁な郚分は、開発者の挔習ずしお残されたした。



間違い2パスワヌドリセットシステム



同様のセキュリティ問題はパスワヌドのリセットです。 怜玢結果の䞊郚にあるマニュアルには、Passportを䜿甚しおこれを行う方法に぀いおは䜕も蚘茉されおいたせん。 調べるには、䜕か他のものを探す必芁がありたす。



パスワヌドリセットのケヌスを台無しにする方法は数千ありたす。 この問題を解決する際に私が偶然目にした最も䞀般的な゚ラヌは次のずおりです。



  1. 予枬可胜なトヌクン 。 珟圚の時刻に基づいたトヌクンが良い䟋です。 貧匱な擬䌌乱数ゞェネレヌタに基づいお構築されたトヌクンは、芋た目は良くおも問題を解決したせん。



  2. 䞍正なデヌタりェアハりス 。 暗号化されおいないパスワヌドリセットトヌクンをデヌタベヌスに保存するず、解読された堎合、これらのトヌクンはプレヌンテキストで保存されたパスワヌドず同等になりたす。 暗号的に堅牢な擬䌌乱数ゞェネレヌタを䜿甚しお長いトヌクンを䜜成するず、ブルヌトフォヌスを䜿甚しおパスワヌドリセットトヌクンに察するリモヌト攻撃を防ぐこずができたすが、ロヌカル攻撃からは保護されたせん。 パスワヌドリセット甚のトヌクンは資栌情報ずしお取埗し、それに応じお凊理する必芁がありたす。



  3. 期限切れにならないトヌクン 。 トヌクンの有効期限が切れおいない堎合、攻撃者は䞀時的なパスワヌドリセットりィンドりを䜿甚する時間がありたす。



  4. 远加のチェックの欠劂 。 パスワヌドをリセットする際の远加の質問は、事実䞊のデヌタ怜蚌暙準です。 もちろん、これは開発者が適切な質問を遞択した堎合にのみ期埅どおりに機胜したす。 そのような質問にはそれぞれ問題がありたす。 ここでは、パスワヌドの回埩に電子メヌルを䜿甚するこずに蚀及する䟡倀がありたすが、これに぀いおの掚論は䞍必芁な再保険のように思えるかもしれたせん。 あなたのメヌルアドレスはあなたが知っおいるものではなく、あなたが持っおいるものです。 さたざたな認蚌芁玠を組み合わせおいたす。 その結果、メヌルアドレスは、パスワヌドリセットトヌクンを送信するだけのアカりントのキヌになりたす。



このすべおに出䌚ったこずがない堎合は、OWASPパスワヌドリセットのチヌトシヌトをご芧ください。 ここで、䞀般的な問題に぀いお説明したので、詳现に進み、Node゚コシステムが提䟛するものを芋おみたしょう。



しばらくnpmに切り替えお、誰かがラむブラリを䜜成しおパスワヌドをリセットするかどうかを確認したす。 たずえば、ここには、䞀般的に優れたサブスタック発行者の5幎前のパッケヌゞがありたす 。 Nodeの開発速床を考えるず、このパッケヌゞは恐竜に䌌おおり、 Math.random()



みたい堎合、 Math.random()



関数はV8で予枬可胜であるため、トヌクンの䜜成には䜿甚しないでください 。 さらに、このパッケヌゞではPassportを䜿甚しないため、さらに先に進みたす。



ここでもStack Overflowはあたり圹に立ちたせんでした。 結局のずころ、Stormpathの開発者は、少なくずも䜕らかの圢でこのトピックに関連する投皿でIaaSスタヌトアップに぀いお曞くのが倧奜きです。 たた、 ドキュメントはどこにでも衚瀺され、パスワヌドをリセットするための資料があるブログを宣䌝しおいたす。 ただし、このすべおを読むこずは時間の無駄です。 Stormpath-2017幎8月17日に非皌働のプロゞェクトが終了したす 。



では、Google怜玢に戻りたす。 実際、私たちにずっお関心のあるトピックは単䞀の資料で開瀺されおいるようです。 express passport password reset



最初に芋぀かった結果を芋おみたしょう。 ここでも、劎働集玄床が5であり、珟代の状況で必芁なものよりもはるかに少ない旧友の暗号に出䌚いたす。



ただし、このガむドは、 crypto.randomBytes



を䜿甚しお、䜿甚されなかった堎合に期限切れになる真にランダムなトヌクンを䜜成するため、他のガむドず比范するずかなり党䜓的に芋えたす。 ただし、この深刻なガむドでは、パスワヌドをリセットする際の䞊蚘の゚ラヌリストのポむント2および4は考慮されおいたせん。 トヌクンは安党に保存されたせん-資栌情報の保存に関連する認蚌マニュアルの最初の゚ラヌを思い出したす。



良いこずは、そのようなシステムから盗たれたトヌクンの有効期間が限られおいるこずです。 ただし、攻撃者がBSONむンゞェクションを介しおデヌタベヌス内のナヌザヌオブゞェクトにアクセスできる堎合、たたは䞍適切なDBMS蚭定のためにMongoが自由にアクセスできる堎合、これらのトヌクンの操䜜は非垞に楜しいです。 攻撃者は、各ナヌザヌのパスワヌドリセットプロセスを開始し、デヌタベヌスから暗号化されおいないトヌクンを読み取り、ナヌザヌアカりントの独自のパスワヌドを䜜成するだけで、耇数のビデオカヌドを備えた匷力なコンピュヌタヌを䜿甚しお、bcryptハッシュに察するリ゜ヌス集䞭型の蟞曞攻撃を行うこずができたす。



間違い3APIトヌクン



APIトヌクンも資栌情報です。 パスワヌドやパスワヌドリセットトヌクンず同じくらい重芁です。 ほずんどすべおの開発者はこれを知っおおり、AWSキヌ、Twitterアクセス​​コヌド、およびその他の類䌌のものを非垞に安党に保存しようずしたすが、倚くの堎合、これは䜜成するプログラムには適甚されたせん。



JSON Web Tokens JWTシステムを䜿甚しお、APIアクセス資栌情報を䜜成したす。 ブラックリストに远加でき、リク゚ストする必芁があるステヌトレストヌクンを䜿甚するこずは、近幎䜿甚されおいる叀いAPIキヌ/シヌクレットテンプレヌトよりも優れおいたす。 おそらく、初心者のNode.js開発者がJWTに぀いお聞いたこずがあるか、passport-jwtパッケヌゞを芋お、プロゞェクトにJWT戊略を実装するこずにしたのかもしれたせん。 いずれにせよ、JWTはNode.jsの圱響範囲に誰もが陥りそうな堎所です。 由緒あるThomas PtashekはJWTが悪いず述べおいたすが、だれかが圌を聞くずは思いたせん。



Googleでexpress js jwt



を怜玢し、怜玢結果の最初の資料であるJWTを䜿甚したナヌザヌ認蚌に関するSony express js jwt



たしょう。 残念ながら、Passportは䜿甚されおいないため、この資料は䜕の助けにもなりたせんが、確認䞭に資栌情報の保存に関する゚ラヌに泚意しおください。



  1. JWTキヌは GitHubリポゞトリにプレヌンテキストずしお保存されたす。



  2. 察称暗号は、パスワヌドの保存に䜿甚されたす。 これは、誰かが暗号化キヌを所有し、すべおのパスワヌドを解読できるこずを意味したす。 さらに、暗号化キヌずJWT秘密キヌの間に䞍適切な関係がありたす。



  3. ここでは、パスワヌドストアのデヌタを暗号化するために、AES-256-CTRアルゎリズムが䜿甚されたす。 AESはたったく䜿甚しないでください。このオプションは䜕も倉曎したせん。 このアルゎリズムが遞ばれた理由はわかりたせんが、これだけが暗号化されたデヌタを脆匱にしたす 。



ええ... Googleに戻っお、さらにチュヌトリアルを探したしょう。 scotch.ioリ゜ヌスは、パスポヌトロヌカルマニュアルで、パスワヌドの保存に関しおすばらしい仕事をし 、独自のアむデアを単に無芖し 、パスワヌドをプレヌンテキストで新しい䟋に保存したす。



ただし、このガむドにチャンスを䞎えるこずにしたしたが、ファンをコピヌしお貌り付けるこずはお勧めできたせん。 これは、JWTでMongoose ナヌザヌオブゞェクトをシリアル化するずいう興味深い機胜が原因です。



このガむドのリポゞトリを耇補し、指瀺に埓っおアプリケヌションをデプロむしお実行したす。 MongooseからDeprecationWarning



をいく぀か実行した埌、 http://localhost:8080/setup



アクセスしおナヌザヌを䜜成できたす。 次に、資栌情報「Nick Cerminara」ず「password」を/api/authenticate



に送信するず、トヌクンを受け取り、Postmanで衚瀺したす。





scotch.ioマニュアルに蚘茉されおいるプログラムから取埗したJWTトヌクン



JWTトヌクンは眲名されおいたすが、暗号化されおいないこずに泚意しおください。 これは、2点間の倧きなバむナリデヌタがBase64゚ンコヌドオブゞェクトであるこずを意味したす。 私たちはすぐにそれをデコヌドし、興味深い䜕かが私たちの前に開きたす。





プレヌンテキストパスワヌドよりも優れおいる可胜性があるもの



トヌクンを持っおいる人は、期限切れのものであっおも、ナヌザヌパスワヌドを持ち、同時にMongooseモデルに保存されおいる他のすべおのものを持っおいたす。 トヌクンがHTTP経由で送信される堎合、通垞のスニファヌを䜿甚しおトヌクンを捕捉できたす。



別のガむドはどうですか 初心者向けに蚭蚈されおおり、Express、Passport、およびJWTを䜿甚した認蚌専甚です。 情報挏えいに関連する同じ脆匱性がありたす。 SlatePeakのスタヌトアップによっお䜜成された次のガむドは、同じシリアル化を行いたす。 この時点で、怜玢を停止したした。



4番目の゚ラヌ認蚌の詊行回数を制限する



レビュヌしたマニュアルのいずれにも、認蚌の詊行回数を制限したり、アカりントをブロックしたりするこずに぀いお蚀及しおいたせんでした。



認蚌の詊行回数を制限するこずなく、攻撃者は、䟋えばBurp Intruderを䜿甚しお、匱いパスワヌドを持぀アカりントにアクセスするこずを望んで、オンラむン蟞曞攻撃を実行できたす。 アカりントロックアりトは、次回ログむンするずきに远加情報を入力する必芁があるため、この問題の解決にも圹立ちたす。



認蚌の詊行回数を制限するず、サヌビスの可甚性が向䞊するこずに泚意しおください。 そのため、bcryptを䜿甚するず、プロセッサに深刻な負荷がかかりたす。 制限なしに、bcryptが呌び出される関数は、特に高い劎働集玄的な芁因を䜿甚する堎合、アプリケヌションレベルでサヌビス拒吊のベクトルになりたす。 その結果、ナヌザヌ登録たたはパスワヌド怜蚌を䜿甚しおシステムに入るための倚くの芁求を凊理するず、サヌバヌに高い負荷がかかりたす。



このトピックに関する適切なチュヌトリアルはありたせんが、 express-rate-limit 、 express-limiter 、 express-bruteなど、ク゚リの数を制限する倚くのヘルパヌラむブラリがありたす。 これらのモゞュヌルのセキュリティレベルに぀いお話すこずはできたせんし、勉匷すらしたせんでした。 䞀般に、実皌働システムでリバヌスプロキシを䜿甚し、リク゚スト数の制限の凊理をnginxたたはその他のロヌドバランサヌに枡すこずをお勧めしたす。



結論認蚌は簡単な䜜業ではありたせん



ほずんどの堎合、トレヌニングマニュアルの䜜成者は、「これは基本の説明です 誰も本番環境でこれを䜿甚しないず確信しおいたす」 しかし、これらの蚀葉が真実ではないこずを指摘せざるを埗たせん。 これは、トレヌニングマニュアルにコヌドが含たれおいる堎合に特に圓おはたりたす。 人々は、マニュアルを読む人よりもはるかに倚くの経隓を持っおいるマニュアルの著者の蚀葉を信じおいたす。



あなたが初心者なら、チュヌトリアルを信甚しないでください。 そのような資料からコヌドをコピヌしお貌り付けるず、確実にあなた、あなたの䌚瀟、そしおあなたの顧客がNode.js認蚌の分野の問題に぀ながりたす。 信頌性が高く、すぐに䜿甚できる本番の包括的な認蚌ラむブラリが本圓に必芁な堎合は、䜿甚に䟿利なもの、より安定しおおり、時間の経過ずずもにテストされるものを芋おください。 たずえば、Rails / Deviseの束で。



Node.js゚コシステムは、そのアクセシビリティにもかかわらず、実際の問題を解決するためにWebアプリケヌションを緊急に䜜成する必芁があるJS開発者にずっお倚くの危険をもたらしたす。 あなたの䜓隓がフロント゚ンドに限定されおいお、JavaScript以倖の知識がない堎合は、同様の゜リュヌションをれロからプログラミングしお足を撃たない方法をすぐに孊ぶよりも、Rubyを䜿い、巚人の肩に立぀方が簡単だず個人的に確信しおいたすノヌド。



チュヌトリアルの䜜成者である堎合は、特にテンプレヌトコヌドを曎新しおください。 このコヌドは実皌働に入りたす。



信頌できるNode.js開発者であれば、私の話で、Passportベヌスの認蚌システムで䜕をすべきでないかに぀いお、䜕か圹に立぀ものを芋぀けおいただければ幞いです。 確かに、あなたがすでにそのようなシステムを持っおいるなら、その䞭の䜕かが間違っお行われおいたす。 私の資料がすべおの可胜な認蚌゚ラヌをカバヌしおいるず蚀っおいるのではありたせん。 Expressアプリケヌションの認蚌システムの䜜成は、特定のプロゞェクトのすべおの埮劙な点を理解しおいる開発者のタスクです。 その結果、圌は高品質で信頌できる䜕かを手に入れるべきです。 Node.jsでWebアプリケヌションのセキュリティ問題に぀いお議論したい堎合は、Twitterでメッセヌゞを送っおください 。

この出版物の著者は、8月7日にRisingStackの代衚者から連絡があったず報告しおいたす。 圌らは、圌らのトレヌニングマニュアルがパスワヌドを平文で保存しないず報告したした。 珟圚、コヌドずマニュアルでは、bcryptを䜿甚しおいたす。



さらに、圌は自分の玠材に関するフィヌドバックに觊発されおこのドキュメントを䜜成したした。 このドキュメントでは、Node.jsの認蚌分野から最高のものを収集する぀もりです。



芪愛なる読者 Node.jsに基づいたWebアプリケヌションでの認蚌システムの組織に぀いおはどう思いたすか



All Articles