諸行無常

IT色々お勉強中のブログ

rubyでFizzBuzzとか素数とか何となくやってみ

オーソドックスにこんな感じ

class Hoge
  (1..100).each do |i|
    if i % 15 == 0
      puts "FizzBuzz"
    elsif i % 3 == 0
      puts "Fizz"
    elsif i % 5 == 0
      puts "Buzz"
    else
      puts i
    end
  end
end

テストしやすくするにはこんな感じ

class Hoge
  def fizzbuzz(i)
    i % 15 == 0
  end
  def fizz(i)
    i % 3 == 0
  end
  def buzz(i)
    i % 5 == 0
  end

  (1..100).each do |i|
    if fizzbuzz i
      puts "FizzBuzz"
    elsif fizz i
      puts "Fizz"
    elsif buzz i
      puts "Buzz"
    else
      puts i
    end
  end

end

Backend Engineer’s meetup ~マイクロサービスにおける認証認可基盤

Backend Engineer’s meetup ~マイクロサービスにおける認証認可基盤

マイクロサービスの内部通信における認証について

@pospome

資料

speakerdeck.com

メルペイ認証チーム(メルカリ、メルペイ) チームに関してはブログあり

  • ユーザアカウント、ログインはそれぞれのチームで担当しているので認証ではやってない

  • 入社、退職などの社内管理はしてない

  • セキュリティはセキュリティーチームに都度相談している

では何をしている

  • OIDC認可の仕組み→今日は説明しない

  • 内部マイクロサービス間の通信認証→こちらを説明

メルカリアプリ Mercari API直接アクセスするパターン

マイクロサービスは Gatewayを介してAuthoriytServiceを利用

AtuhorityServiceは何をしている?

  • リクエストの検証→アクセストークンを検証 AuthoriytServiceで全てのサービスを検証できてない歴史的経緯

  • 各サービスはトークンで検証

  • 内部トークンと外部トークンは別物らしい

    1リクエスト1トーク

    JWTを採用

    内部トークン用SDKを採用

  • トークン検証 gRPCのintercepter

  • gorouting

    subjectID

  • 文字列type value 複数のID体系を一つの構成で

  • メルカリを受け取る場合、typeをチェックして弾く

  • パース処理は、SDKで実装

    内部アクセス制限

  • 内部スコープ 各サービスがもつリソースに持つ

  • 外部スコープをそのまま内部スコープにセットすることができる

  • AuthoriytServiceでauthトークンを検証したあと内部トークンを生成する

  • 外部、内部スコープが一致しない場合。

    外部スコープ→ユースケースベース

    内部スコープ→リソースベース

    マッピングするテーブルを持たす

    内部トークンのメリット

  • トークンを1種にできる 直接内部リソースにアクセスできない

  • 外部のアクセストークンを短く設定出来る

できてないこと沢山ある

パネルディスカッション

質問

→関連するマイクロサービスが多ければ多いほど、関わるものが多くなる。ユーザからはどのマイクロ使うかわからないので。ユースケース毎にマッピングテーブルを持たした

→有効期限、保存していない。可用性→サーバを複数台用意して分散しているけど特別なことはしていない

  • 各サービス間のアクセス制御

→マイクロサービス間の認証はやっていない。導入しようとは検討している。originのリクエスト権限の範囲で処理できる機能を制限している。

  • 外部スコープと内部スコープの管理→各部門が申請して管理している?監査している?

→まだそこは全然考えていない。そのフェーズにはいってない。課題として考えている

  • 公開鍵の管理、前何世代までOK →前の鍵が使えなくなることは無い。

  • BASE64の長さが長くなってパフォーマンス問題ならない?

→JWTだとデータ量が多くなるからやめたい→CWTの機運

  • アカウントの管理は対象外、アカウントの認証はどこでしている?

→リクエストについているアクセストークンで判断。ログイン部分はマイクロサービス化していない

  • 1リクエスト1トークン可用性、性能面で意識したこと

→レイテンシ、そこまで気にしない。モノリスにするのが一番早いので考えない。必ず通るとこはなるべく早くするように心がけている。ローカルメモリで完結。memchacheとか使いたいがそこまではしてない

  • トークンの検証SDK自体の更新はどうしている、配信とかは →いい仕組みは出ていない。スプレッドシートで書いて上げている→辛い。正しく提供しているのはGOだけsidecarとかで運用したい

  • 内部トークンを有効期限

→すごく短く。どんなけ待つ必要があるか目安

→アカウントの種類が増えると増やすけど、アカウントそんな増えない。マスターデータが増えるタイミングは自動化したい

→ある。内部トークンを取得して実施している。秘密鍵を利用している→スコープは現状紐づけていない

  • AuthoriytServiceだけでチェックで十分では?

→内部サービス間の通信は必ず大丈夫と認識していないのでそうしている

→pubsub非同期で扱わないといけない時、有効期限が切れた時どうするのか。解決策は特に無い

  • 苦労話

→内部通信の技術的な課題をどう解決するか?リソースが足りないPOもやっているので精神的に辛い

→複雑な考え方が社内で通じるのか不安だったが、使われて良かった。

→チームが四人しかいない。人手が足りない。DCまたいで通信が切れたら大障害になっちゃう。認可サーバー経験が豊富で無いのでセキュリティ大丈夫か不安

Railsで ActiveRecord::LockWaitTimeoutエラーが出た時

RailsActiveRecord::LockWaitTimeoutエラーが出た時

  • 以下エラーが出た時
 ActiveRecord::LockWaitTimeout:
       Mysql2::Error::TimeoutError: Lock wait timeout exceeded; try restarting 
  • mysqlがロックされている
mysql -u root -p -h hoge -p
  • mysqlに入って見てみよう、何かロックされてる
SHOW ENGINE INNODB STATUS;


------------
TRANSACTIONS
------------
Trx id counter 2777594
Purge done for trx's n:o < 2776093 undo n:o < 0 state: running but idle
History list length 269
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 421126298403792, not started
0 lock struct(s), heap size 1136, 0 row lock(s)


24 lock struct(s), heap size 1136, 229 row lock(s), undo log entries 616
MySQL thread id 88, OS thread handle 139650437109504, query id 83569 172.18.0.9 root cleaning up
Trx read view will not see trx with id >= 2776091, sees < 2776091
  • killする
kill 88

解決

folk爆弾について

folk爆弾について

:(){ :|:& };:

これについて自分なりに理解

  • ":()" は ":" という関数(引数なし)

  • “{ :|:& };” が本体自分自身(:)を2つ起動してパイプでつなぐ、バックグラウンドで実行

  • 最後の ":" がその関数の実行開始

webpack3→4でエラーになった MiniCssExtractPlugin

  • MiniCssExtractPluginの設定が上手くいってなくて動いてない

webpack/environment.js

const vue = require('./loaders/vue')
const sass = require('./loaders/sass')
const css = require('./loaders/css')


  module: {
    rules: [
      vue,
      sass,
      css,
    
  plugins: [
    new VueLoaderPlugin(),
    new MiniCssExtractPlugin({
      filename: '[name]-[hash].css'
    }),

webpack/loaders/css.js

const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
  test: /\.(css)$/,
  use: [MiniCssExtractPlugin.loader, 'css-loader']
}

webpack/loaders/sass.js

module.exports = {
  test: /\.(scss|sass)$/,
  use: ['vue-style-loader', 'css-loader', 'sass-loader']
}

SPAのAPIのCSRF保護

翻訳自分で読むため、許可は取ってない

blog.eq8.eu

用語定義

https://railsguides.jp/security.html#%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA-csrf

  • この例では削除アクションにGETリクエストを使用していますが、ガイドラインのリンクで詳しく説明されているように、悪意のあるWebサイトにPOSTまたはDELETEリクエストをこのように送信させることが可能です。

  • 通常、「静的Webサイトからフォームを送信する」という文脈でCSRF攻撃保護が言及されています。私は最近、API呼び出しに関連するCSRF保護について詳しく読んでいましたが、さまざまなテクノロジのWeb開発者が言うのはあまりに一般的です。→「APIに対するCSRF攻撃保護は必要ありません。」

  • そのことを頭に入れて、通常彼らは、APIがブラウザ以外の他のクライアント技術(例えば、AndroidiPhone、あなたのスマート冷蔵庫)によって使われることが予想されるアプリケーションについて話しています。しかし、通常この文脈ではブラウザセッションを使用しません。 しかし、ブラウザセッションを使用するアプリケーション(例:Devise Gemを使用しているRuby on Rails開発者)がいなくて、そのアプリケーションがAPIと通信している場合は、CSRF保護が必要です。

結論

アプリケーションがセッション/クッキーを使用する場合は、CSRF保護が必要です。他の形式の認証(前述のAWSがCognitoを介してリクエストに署名したようなもの)がある場合は、CSRF保護は必要ありません。

Ruby on Rails WebフレームワークでCSRF APIを処理する方法

  • Railsにはprotect_from_forgeryメソッドがあります。これはコントローラに配置でき、CSRFトークンが提供されていない限りPOST PUT PATCH DELETE呼び出しが発生しないようにします。

  • しかし問題はこのトピックがRails Helperを使ってCSRFトークンをレンダリングする静的サイトを扱っていると仮定していることです<<= = csrf_meta_tags%>

  • しかし、シングルページアプリを扱うときは、最初のレンダリング時にのみ新鮮なcsrf-tokenがあることを意味します。

  • CSRFトークンをCookieに格納するようにバックエンドを設定し、その後FrontEndフレームワーク(Angular、React)がCookieから新しい値を取得するというソリューションを指している人々を見ました。

  • そのため、このようにしてhttp://www.webapp.com/project/1を削除する悪意のある要求がCSRF-TOKENなしで行われることになります=>は実行されません。

これを詳細に説明した良い情報源がすでにあるので、私は段階的なチュートリアルを書くつもりはないです:

https://technpol.wordpress.com/2014/04/17/rails4-angularjs-csrf-and-devise/ https://stackoverflow.com/questions/14734243/rails-csrf-protection-angular-js-protect-from-forgery-makes-me-to-log-out-on https://github.com/jsanders/angular_rails_csrf (gem solution) deep details how CSRF Rails protection work

vue-loaderとは

vue-loader

  • vue-loaderはWebpack用のローダーです。これを使用すると、シングルファイルコンポーネントSFC)と呼ばれる形式でVueコンポーネントを作成できます。 v15からpuluginの読み込みが必須になった
const VueLoaderPlugin = require('vue-loader/lib/plugin')

module.exports = {
  // ...
  plugins: [
    new VueLoaderPlugin()
  ]
}

vue-loader.vuejs.org

他にも色々変わったらしいが読むのがめんどい