DNS CAAは、不正なサーバ証明書の発行を防ぎます。

前回の勉強内容

ponsuke-tarou.hatenablog.com

DNS CAAは、不正なサーバ証明書の発行を防ぎます。

DNSにおいてDNS CAA(Certification Authority Authorization)レコードを使うことによるセキュリティ上の効果はどれか。

  1. WebサイトにアクセスしたときのWebブラウザに鍵マークが表示されていれば当該サイトが安全であることを,利用者が確認できる。
  2. Webサイトにアクセスする際のURLを短縮することによって,利用者のURLの誤入力を防ぐ。
  3. 電子メールを受信するサーバでスパムメールと誤検知されないようにする。
  4. 不正なサーバ証明書の発行を防ぐ。 << 正解

出典 : 令和3年 春期 情報処理安全確保支援士 午前Ⅱ 問10


DNSサーバが管理するドメインの範囲をゾーンといいます。
ゾーンの情報はゾーンファイルというファイルに設定され、その1つ1つをレコードといいます。

そして、「Certification Authority(認証局)」を「Authorization(許可)」するコードがCAAです。

認証局は、CAAを確認して証明書を発行していいか判断します。

証明書は認証局が発行します。
なので、ドメイン管理者は、ドメインサブドメインの証明書を発行する時に認証局にお願いします。
お願いされた認証局は、CAAを確認することで自分に証明書発行が許可されているかを確認します。
許可されていなかったら、お願いしたドメイン管理者に「間違っているよ」と教えてあげます。
許可されていたら、証明書を発行します。

たとえば、「example.com. 86400 IN CAA 0 issue “ca.example.net”」というCAAが設定されていると
example.comとそのサブドメイン」の証明書を
TTL(86400秒)期限内あるいは8時間以内」に発行することを
「ca.example.netという認証局」に「issue(許可)」するよ
ということになります。
参考 : DNS CAAとは

f:id:ponsuke_tarou:20220330224017j:plain
赤羽香取神社の神様かもしれない猫

次回の勉強内容

ponsuke-tarou.hatenablog.com

DNS水責め攻撃は、オープンリゾルバを利用して権威DNSサーバを過負荷にします。

前回の勉強内容

ponsuke-tarou.hatenablog.com

DNS水責め攻撃は、オープンリゾルバを利用して権威DNSサーバを過負荷にします。

f:id:ponsuke_tarou:20220330184227j:plain

DNS水責め攻撃(ランダムサブドメイン攻撃)の手口と目的に関する記述のうち,適切なものはどれか。

  1. ISPが管理するDNSキャッシュサーバに対して,送信元を攻撃対象のサーバのIPアドレスに詐称してランダムかつ大量に生成したサブドメイン名の問合せを送り,その応答が攻撃対象のサーバに送信されるようにする。
  2. オープンリゾルバとなっているDNSキャッシュサーバに対して,攻撃対象のドメインサブドメイン名をランダムかつ大量に生成して問い合わせ,攻撃対象の権威DNSサーバを過負荷にさせる。 << 正解
  3. 攻撃対象のDNSサーバに対して,攻撃者が管理するドメインサブドメイン名をランダムかつ大量に生成してキャッシュさせ,正規のDNSリソースレコードを強制的に上書きする。
  4. 攻撃対象のWebサイトに対して,当該ドメインサブドメイン名をランダムかつ大量に生成してアクセスし,非公開のWebページの参照を試みる。

出典 : 平成29年 春期 情報処理安全確保支援士 午前Ⅱ 問6

ランダムな存在しないサブドメイン名を生成して大量に問い合わせるので「ランダムサブドメイン攻撃」とも言います。

DNS水責め攻撃(ランダムサブドメイン攻撃)の方法はどれか。

  1. 標的のキャッシュサーバに,ランダムかつ大量に生成した偽のサブドメインDNS情報を注入する。
  2. 標的の権威DNSサーバに,ランダムかつ大量に生成した存在しないサブドメイン名を問い合わせる。 << 正解
  3. 標的のサーバに,ランダムに生成したサブドメインDNS情報を格納した,大量のDNSレスポンスを送り付ける。
  4. 標的のサーバに,ランダムに生成したサブドメインDNS情報を格納した,データサイズが大きいDNSレスポンスを送り付ける。

出典 : 平成30年 春期 データベーススペシャリスト 午前Ⅱ 問20

f:id:ponsuke_tarou:20220330205444j:plain
十条銀座でカレーランチ

次回の勉強内容

ponsuke-tarou.hatenablog.com

IEEE802.1Xとそのプロトコル達

前回の勉強内容

ponsuke-tarou.hatenablog.com

IEEE802.1Xは、ユーザ認証とアクセス制御を行うプロトコルの規格です。

知らない人が、ネットワークに接続してこないようにユーザ認証とアクセス制御をするプロトコルの規格です。

無線LANの認証で使用される規格IEEE 802.1xが規定しているものはどれか。

  1. アクセスポイントがRADIUSサーバと連携するユーザ認証の枠組み << 正解
  2. アクセスポイントが認証局と連携し,暗号化パスワードをセションごとに生成する仕組み
  3. ディジタル証明書を使って認証するプロトコルWEP
  4. 無線LANの認証プロトコルとして,信号レベルで衝突を検知するCSMA/CD方式

https://www.ap-siken.com/kakomon/17_aki/img/74.gif
平成17年秋期問74 IEEE 802.1xが規定しているもの|応用情報技術者試験.com

IEEE802.1Xで認証を行うためには、「サプリカント」「認証装置」「認証サーバ」を使用します。

構成要素 英語表記 立場 機器
サプリカント Supplicant 認証クライアント パソコンなどのクライアントにインストールされるソフトウェア
認証装置 Authenticator サプリカントと認証サーバの仲介役 スイッチや無線LAN
認証サーバ Authentication Server 認証を行うサーバ RADIUSなど

f:id:ponsuke_tarou:20220323203810j:plain

無線LAN環境に複数台のPC、複数台のアクセスポイント及び利用者認証情報を管理する1台のサーバがある。利用者認証とアクセス制御にIEEE802.1XとRADIUSを利用する場合の特徴はどれか。

  1. PCにはIEEE802.1Xのサプリカントを実装し、RADIUSクライアントの機能をもたせる。 << 正解
  2. アクセスポイントにはIEEE802.1Xのオーセンティケータを実装し、RADIUSクライアントの機能をもたせる。
  3. アクセスポイントにはIEEE802.1Xのサプリカントを実装し、RADIUSサーバの機能をもたせる。
  4. サーバにはIEEE802.1Xのオーセンティケータを実装し、RADIUSサーバの機能をもたせる。

出典 : 平成25年 春期 情報セキュリティスペシャリスト試験 午前Ⅱ 問7

f:id:ponsuke_tarou:20220314181113j:plain
駒込にあるjam coffeeの真珠パンケーキ

EAPは、IEEE802.1Xに使えるプロトコルです。

英語では、「PPP Extensible(伸張性の) Authentication(認証) Protocol」です
2点間で仮想の経路を確立してデータを送受信できるようにするPPPという通信プロトコルがあります。
このPPPを拡張したプロトコルEAPです。
ponsuke-tarou.hatenablog.com

EAPでは、いろんな認証プロトコルを使えます。

EAPに認証機能があるわけではありません。
「有線LANや無線LANデータリンク層」と「いろんな認証プロトコル」の間を取り持つのがEAPです。

名称 認証プロトコル クライアント認証 サーバ認証
EAP-MD5 MD5 ユーザID/パスワード
パスワードはCHAPでハッシュ化する
なし
EAP-TLS TLS 証明書 証明書
EAP-TTLS TTLS ユーザID/パスワード 証明書
EAP-PEAP PEAP ユーザID/パスワード 証明書

IEEE802.1Xで使われるEAP-TLSによって実現される認証はどれか。

  1. CHAPを用いたチャレンジレスポンスによる利用者認証 << EAP-MD5の説明
  2. あらかじめ登録した共通鍵によるサーバ認証と,時刻同期のワンタイムパスワードによる利用者認証 << EAP-TTLSの説明
  3. ディジタル証明書による認証サーバとクライアントの相互認証
  4. 利用者IDとパスワードによる利用者認証

出典 : 平成24年 秋期 情報セキュリティスペシャリスト試験 午前Ⅱ 問2

CHAPはパスワードをハッシュ化するプロトコルです。

英語では「Challenge-Handshake Authentication(認証) Protocol」です。
サーバへパスワードを送信する時にそのまま平文で送ると危ないので、「チャレンジ」と「パスワード」を合わせてハッシュ化します。
「チャレンジ」は、ランダムな短いデータのことです。

f:id:ponsuke_tarou:20220323203928j:plain
逗子海岸ロードオアシスのまるわ食堂でのお昼ご飯

次回の勉強内容

ponsuke-tarou.hatenablog.com

Visual Studio CodeとDockerを使ってでVue.jsをやってみる

環境 : macOS Monterey バージョン12.2.1

準備する

  1. Visual Studio Codeを準備する
    1. Visual Studio Codeをインストールする
    2. [View] > [Extensions] > 「Remote-Containers」を検索してインストールする
      • f:id:ponsuke_tarou:20210118115540p:plain
  2. Docker Desktopをインストールする

f:id:ponsuke_tarou:20220314180353j:plain
板橋52のアクアセゾン

コンテナを作る

  1. 任意の場所にDocker環境用のディレクトリを作成する
    1. 今回は、~/docker/vueというディレクトリにしてみた
  2. Shift + Command + P > [Remote-Containers: Open Folder in Container…] > 作成したディレクトリを選択する
  3. [Show All Definitions...] > 「vue」を入力して表示されたVue (Community)を選択する
    1. f:id:ponsuke_tarou:20220228162414p:plain
  4. Node.jsのバージョンを選択する(今回はdefaultの「16」にした)
  5. 追加で欲しいものがあれば選択する > [OK]を押下するとコンテナが作成される
    1. f:id:ponsuke_tarou:20220228162432p:plain
      今回は何も選択しなかった
  6. コンテナに入っている状態のVisual Studio Codeが開く
    1. .devcontainerディレクトリが作成されて中にdevcontainer.jsonとDockerfileが格納されている
    2. DockerfileをみるとVue開発用のコマンドツールであるVue CLIとVue cli-service-global(Vue CLIで使うもの)もインストールしていた
    3. f:id:ponsuke_tarou:20220228162518p:plain

f:id:ponsuke_tarou:20220314180835j:plain
荒川区のアクアリゾートに行く前に食べたラーメン

プロジェクトを作る

Vue CLIvue create {プロジェクト名}でプロジェクトを作成できる。

# プロジェクト作成を開始する
$ vue create my_app
# 「本家のレジストリは接続が遅いのでミラーサイトを使用するか」を聞かれます。
?  Your connection to the default yarn registry seems to be slow.
   Use https://registry.npmmirror.com for faster installation? (Y/n) No # << 本家のレジストリを使うため「n」を入力
# Vueのバージョンを選択する(細かく設定したい場合は「Manually select features」を選択する)
Vue CLI v5.0.1
? Please pick a preset: (Use arrow keys)
❯ Default ([Vue 3] babel, eslint) 
  Default ([Vue 2] babel, eslint) 
  Manually select features

# パッケージ管理を選択する
Vue CLI v5.0.1
? Please pick a preset: Default ([Vue 3] babel, eslint)
? Pick the package manager to use when installing dependencies: 
❯ Use Yarn 
 Use NPM 

# プロジェクトが作成される
Vue CLI v5.0.1
✨  Creating project in /workspaces/docker/vue/my_app.
⚙️  Installing CLI plugins. This might take a while...

yarn install v1.22.17
info No lockfile found.
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
Done in 150.03s.
🚀  Invoking generators...
📦  Installing additional dependencies...

yarn install v1.22.17
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...

success Saved lockfile.
Done in 34.63s.
⚓  Running completion hooks...

📄  Generating README.md...

🎉  Successfully created project my_app.
👉  Get started with the following commands:

 $ cd my_app
 $ yarn serve

# こんな感じの構成でプロジェクトができた
$ find -maxdepth 2
.
./.devcontainer
./.devcontainer/Dockerfile
./.devcontainer/devcontainer.json
./my_app
./my_app/.gitignore
./my_app/README.md
./my_app/babel.config.js
./my_app/jsconfig.json
./my_app/node_modules
./my_app/package.json
./my_app/public
./my_app/src
./my_app/vue.config.js
./my_app/yarn.lock

プロジェクトを実行する

# プロジェクトのディレクトリへ移動して
$ cd my_app/
# プロジェクトを実行する
$ yarn serve
yarn run v1.22.17
$ vue-cli-service serve
 INFO  Starting development server...


 DONE  Compiled successfully in 16223ms                                                           9:02:46 AM


  App running at:
  - Local:   http://localhost:8080/ 
  - Network: http://172.17.0.2:8080/

  Note that the development build is not optimized.
  To create a production build, run yarn build.

f:id:ponsuke_tarou:20220228170850p:plain
プロジェクトを実行して「http://localhost:8080/」をブラウザで表示する

f:id:ponsuke_tarou:20220314180930j:plain
荒川10のアクアリゾート

ディジタルフォレンジックスでサイバー犯罪を科学捜査

前回の勉強内容

ponsuke-tarou.hatenablog.com

ディジタルフォレンジックスは、電子機器で犯罪の証拠を捜査する手法です。

外部からの不正アクセスによるコンピュータに関する犯罪の疑いが生じた。そのとき,関係する機器やデータ,ログなどの収集及び分析を行い,法的な証拠性を明らかにするための手段や技術の総称はどれか。

  1. ディジタルサイネージ
  2. ディジタル署名
  3. ディジタルディバイド
  4. (答え)ディジタルフォレンジック

出典 : 平成31年 春期 ITパスポート試験 問99

ディジタルフォレンジックスは、digital forensics(科学捜査)です。
多岐にわたるサーバー犯罪の証拠を集めて保全して分析する科学捜査の手法です。

ディジタルフォレンジックスの説明として,適切なものはどれか。

  1. あらかじめ設定した運用基準に従って,メールサーバを通過する送受信メールをフィルタリングすること
  2. サーバに対する外部からの攻撃や不正なアクセスを防御すること
  3. 磁気ディスクなどの書換え可能な記憶媒体を単に初期化するだけではデータを復元される可能性があるので,任意のデータ列で上書きすること
  4. (答え)不正アクセスなどコンピュータに関する犯罪の法的な証拠性を確保できるように,原因究明に必要な情報の保全,収集,分析をすること

出典 : 平成26年 春期 応用情報技術者試験 午前 問41

目的には、犯罪の原因追求だけではなく責任の所在を明らかにしたりと裁判に向けた備えもあります。

ディジタルフォレンジックスに該当するものはどれか。

  1. 画像や音楽などのディジタルコンテンツに著作権者などの情報を埋め込む。
  2. コンピュータやネットワークのセキュリティ上の弱点を発見するテスト手法の一つであり,システムを実際に攻撃して侵入を試みる。
  3. ネットワーク管理者や利用者などから,巧みな話術や盗み聞き,盗み見などの手段によって,パスワードなどのセキュリティ上重要な情報を入手する。
  4. (答え)犯罪に関する証拠となり得るデータを保全し,その後の訴訟などに備える。

出典 : 令和2年 秋期 情報処理安全確保支援士試験 午前Ⅱ 問13

f:id:ponsuke_tarou:20210929182954j:plain
埼玉県深谷市にある滝澤酒造のレンガ煙突

証拠となり得るデータを「保全」「収集」「分析」します。

犯罪が発生したら「現場保存」とよくドラマでも言っています。
犯罪の対象となったコンピュータなどの電子機器における犯罪発生時点のデータをきっちり「保全」します。

犯罪によっては、データを勝手に削除するので削除履歴などからデータ復元もして証拠を「収集」します。

ディジタルフォレンジックスの手順を収集,検査,分析,報告に分けたとき,そのいずれかに該当するものはどれか。

  1. サーバとネットワーク機器のログをログ管理サーバに集約し,リアルタイムに相関分析することによって,不正アクセスを検出する。
  2. (答え)ディスクを解析し,削除されたログファイルを復元することによって,不正アクセスの痕跡を発見する。
  3. 電子メールを外部に送る際に,本文及び添付ファイルを暗号化することによって,情報漏えいを防ぐ。
  4. プログラムを実行する際に,プログラムファイルのハッシュ値と脅威情報を突き合わせることによって,マルウェアを発見する。

出典 : 平成31年 春期 応用情報技術者試験 午前 問39

ハッシュ関数を使って「収集」したデータのコピーからハッシュ値を得ておいて、原本のハッシュ値と比較して一切変更されていないことを確認できるようにしておきます。
そうすると、後で情報開示や裁判の時に証拠をきっちり「保全」していることを証明できます。

ディジタルフォレンジックスでハッシュ値を利用する目的として,適切なものはどれか。

  1. 一方向性関数によってパスワードを復元できないように変換して保存する。
  2. 改変されたデータを,証拠となり得るように復元する。
  3. (答え)証拠となり得るデータについて,原本と複製の同一性を証明する。
  4. パスワードの盗聴の有無を検証する。

出典 : 平成28年 春期 基本情報技術者試験 午前 問44

f:id:ponsuke_tarou:20210929183316j:plain
滝澤酒造の大吟醸升田屋は値段以上の美味しさ

次回の勉強内容

ponsuke-tarou.hatenablog.com

押し寄せるDNSへの攻撃

前回の勉強内容

ponsuke-tarou.hatenablog.com

DNSは、ドメイン名やホスト名などとIPアドレスとを対応付けます。

ponsuke-tarou.hatenablog.com

DNSは、「ドメイン名」を受け取ってから「IPアドレス」を返したり、「IPアドレス」を受け取って「ホスト名」を返したりと「ドメイン名やホスト名」と「IPアドレス」の紐付けをしてくれます。
正式名称は、Domain(領域) Name(名前) Systemです。
こんな便利なDNSは、いろんな種類の攻撃を受けます。

令和3年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問2」を参考にDNSへの攻撃をお勉強します。

DNSに反射させるDNSリフレクション攻撃

  • 英語 : DNS reflection(反射) attack(攻撃)
  • 別名 : DNSアンプ攻撃(DNS amplification(増幅) attack)、DNSリフレクター攻撃

DNSリフレクション攻撃は、送信元のIPアドレスを偽装してDNSへ大量の問い合わせを行います。
IPアドレスは、攻撃対象のIPアドレスに偽装します。
そうするとDNSは、攻撃対象のIPアドレスに大量の応答を返すので攻撃対象が過負荷に陥ってしまいます。

f:id:ponsuke_tarou:20210922182811j:plain

攻撃者は、②送信元のIPアドレスを偽装した名前解決要求を外部DNSサーバに送ることによって、外部DNSサーバを踏み台とし、攻撃対象となる第三者のサーバに対し大量のDNSパケットを送りつけるというDos攻撃を行える。
(省略)
設問1(2)本文中の下線②の攻撃名称を20字以内で答えよ。>> 答え)DNSリフレクション攻撃

出典:令和3年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問2

オープンリゾルバは、知らない人からの問い合わせでも対応してしまいます。

オープンリゾルバは、アクセス制限をしておらず、不特定の相手の問い合わせにも対応してしまうDNSサーバです。
悪い人から踏み台として利用されてしまいます。

オープンリゾルバの中には、 デフォルト設定のままであるなどの理由で、 本来はDNSサーバを意図したものではないにも関わらず、 管理者や利用者が気づかないうちにDNSの応答機能が有効になっているものがあります*4。

オープンリゾルバとなっているサーバやネットワーク機器は、 DDoS攻撃の踏み台になってしまう恐れがあるため、 対策をとることが必要です。

(ご注意)オープンリゾルバの中にはDDoS攻撃の踏み台などに悪用されないように、 対策が取られているものがあります。
オープンリゾルバ(Open Resolver)に対する注意喚起 - JPNIC

IPアドレスの偽装を簡単にできるUDPを使って攻撃します。

UDP(User Datagram Protocol)は、最小限の仕組みでデータを送受信できるようにしているので「リアルタイム性に優れた」反面「IPアドレスの偽装が容易にできる」のです。
DNSリフレクション攻撃では、悪い人が自分のIPアドレスを偽装するのにUDPを使うのです。

UDPの性質を悪用したDDoS攻撃に該当するものはどれか。

  1. (答え)DNSリフレクタ攻撃
  2. SQLインジェクション攻撃
  3. ディレクトリトラバーサル攻撃
  4. パスワードリスト攻撃

出典:平成30年 秋期 情報処理安全確保支援士 午前Ⅱ 問7

DNSリフレクション攻撃の踏み台にならないための対策

「令和3年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問2」から踏み台にならないための対策を見ていきます。

まずは、「DNSサーバを分離する」です。
「外部DNSサーバ」として名前解決を一挙に請け負っていたサーバを「権威DNSサーバ」「フルサービスリゾルバ」に分けて役割を分担させます。

外部DNSサーバを廃止した上で、DNS-KとDNS-FというDNSサーバをDMZ上に新設し、権威DNSサーバの機能をDNS-Kに、フルサービスリゾルバの機能をDNS-Fに移行することを考えた。

出典:令和3年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問2

機能 説明 参考サイト
権威DNSサーバ(コンテンツサーバ) 特定のゾーン情報を持っていて、他のサーバーに問い合わないで名前解決できる インターネット用語1分解説~権威DNSサーバ(authoritative name server)とは~ - JPNIC
フルサービスリゾルバ(キャッシュサーバー) 自分で持っているキャッシュ情報か権威DNSサーバへの合わせで名前解決する JPRS用語辞典|フルサービスリゾルバー(キャッシュDNSサーバー)

DNSサーバを分離した上で、ファイアーウォールのフィルタリングルールを変更して接続を制限します。

(変更前)

項番 送信元 宛先 サービス 動作
5 外部DNSサーバ インターネット DNS 許可
6 インターネット 外部DNSサーバ DNS 許可
... ... ... ... ...
14 全て 全て 全て 拒否

インターネットからフルサービスリゾルバへの問い合わせを受け付けないようにして、何でもかんでも名前解決を受け付けないように制限します。

(変更後)

項番 送信元 宛先 サービス 動作
5 DNS-F(フルサービスリゾルバ) インターネット DNS 許可
6 インターネット DNS-K(権威DNSサーバ) DNS 許可
... ... ... ... ...
14 全て 全て 全て 拒否

DNS再帰的な問合せを使ったサービス不能攻撃(DNS amp)の踏み台にされることを防止する対策はどれか。

  1. (答え)キャッシュサーバとコンテンツサーバに分離し,インターネット側からキャッシュサーバに問合せできないようにする。
  2. 問合せされたドメインに関する情報をWhoisデータベースで確認する。
  3. 一つのDNSレコードに複数のサーバのIPアドレスを割り当て,サーバへのアクセスを振り分けて分散させるように設定する。
  4. 他のDNSサーバから送られてくるIPアドレスとホスト名の対応情報の信頼性をディジタル署名で確認するように設定する。

出典:平成24年 春期 情報セキュリティスペシャリスト試験 午前Ⅱ 問14

f:id:ponsuke_tarou:20210929071830j:plain
ゴールデンウィークのとあるお食事

キャッシュポイズニング攻撃

フルサービスリゾルバ(キャッシュサーバー)では、問い合わせ内容を覚えておきます(キャッシュ)。
こうすることで、内容と同じ問い合わせがまた来た時にキャッシュの情報を送信元へ返して、何度も権威DNSサーバに問い合わせなくて済むようにしています。

このキャッシュを蓄積する機能を利用して、悪い人が嘘の情報をキャッシュとして蓄積されるようにするのがキャッシュポイズニング攻撃です。

DNSキャッシュポイズニングに分類される攻撃内容はどれか。

  1. DNSサーバのソフトウェアのバージョン情報を入手して,DNSサーバのセキュリティホールを特定する。
  2. (答え)PCが参照するDNSサーバに誤ったドメイン情報を注入して,偽装されたWebサーバにPCの利用者を誘導する。
  3. 攻撃対象のサービスを妨害するために,攻撃者がDNSサーバを踏み台に利用して再帰的な問合せを大量に行う。
  4. 内部情報を入手するために,DNSサーバが保存するゾーン情報をまとめて転送させる。

出典:平成29年 秋期 基本情報技術者試験 午前 問37


なぜ、「嘘の情報」をキャッシュとして蓄積されるようにするかというと
「嘘の情報」として偽サイトや偽サーバに誘導して情報を盗もうとするからです。

M社のショッピングサイトにアクセスしていた福岡営業所の社員Aさんから、①「ホームページのリンクをクリックしてショッピングサイトにアクセスしようとしたところ、いつも表示されるショッピングサイトとは違うサイトが表示された。」という報告が東京本社に入った。

平成22年度春期 応用情報技術者試験 午後 問9

DNSキャッシュポイズニング攻撃が成功すると、攻撃対象のフルサービスリゾルバが管理するリソースレコードのうち、メールサーバのAレコードのIPアドレスが、例えば攻撃者のメールサーバのものに書き換えられてしまい、電子メールが攻撃者のサーバに送信されてしまう。

出典:令和3年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問2

再帰的な問合せに対しては、内部ネットワークからのものだけに応答するように設定します。

f:id:ponsuke_tarou:20210928071046j:plain

DNSキャッシュサーバに対して外部から行われるキャッシュポイズニング攻撃への対策のうち,適切なものはどれか。

  1. 外部ネットワークからの再帰的な問合せにも応答できるように,コンテンツサーバにキャッシュサーバを兼ねさせる。
  2. (答え)再帰的な問合せに対しては,内部ネットワークからのものだけに応答するように設定する。
  3. 再帰的な問合せを行う際の送信元のポート番号を固定する。
  4. 再帰的な問合せを行う際のトランザクションIDを固定する。

出典:平成29年 春期 応用情報技術者試験 午前 問41

DNSヘッダ内のIDはランダムに変更します。

DNSの問い合わせの仕組みとして、キャッシュサーバは、権威サーバに問い合わせを送る時にIDを合わせて送ります。
権威サーバから応答が返ってきた時に自分が送ったIDと同じIDがメッセージに指定されていれば、正しい応答だと信じます。
自分が送ったIDと違うIDがメッセージに指定されていれば、不正な応答だと思って捨ててしまいます。

https://www.nic.ad.jp/ja/newsletter/No40/images/0800_3.gif
インターネット10分講座:DNSキャッシュポイズニング - JPNIC

なので問い合わせする時に指定するIDはランダムにしておかないと悪い人に悪用されてしまいます。

DNSキャッシュポイズニング攻撃に対して有効な対策はどれか。

  1. DNSサーバで,マルウェアの侵入をリアルタイムに検知する。
  2. (答え)DNS問合せに使用するDNSヘッダ内のIDを固定せずにランダムに変更する。
  3. DNS問合せに使用する送信元ポート番号を53番に固定する。
  4. 外部からのDNS問合せに対しては,宛先ポート番号53のものだけに応答する。

出典:平成28年 春期 情報セキュリティスペシャリスト 午前Ⅱ 問12

カミンスキー攻撃は、進化したキャッシュポイズニング攻撃です。

カミンスキーさんが発見したカミンスキー攻撃は、「ランダム文字列」と「乗っ取り対象のドメイン名」を合わせることで、わざとキャッシュにない情報でフルサービスリゾルバが権威DNSサーバに問い合わせを行うようにします。
そして、すかさず偽情報をフルサービスリゾルバに送りつけることで効率的に偽情報をキャッシュさせます。

https://www.nic.ad.jp/ja/newsletter/No40/images/0800_6.gif
インターネット10分講座:DNSキャッシュポイズニング - JPNIC

再帰的な問合せを行う際の送信元のポート番号をランダム化します。

UDPは、「情報の偽装が容易にできる」できてしまうので、権威サーバのふりをして問い合わせで使用するIDも偽装してくることがあります。

キャッシュサーバから権威サーバへ問い合わせるときに使用するUDPポート番号を、固定あるいは狭い範囲で使用するのではなく、広範囲な番号からランダムに選択して通信に使用することによって、応答パケットの偽装を難しくさせる方法です。偽装の難易度は、ポート番号の利用範囲に比例して難しくなります(図7)。
https://www.nic.ad.jp/ja/newsletter/No40/images/0800_7.gif

インターネット10分講座:DNSキャッシュポイズニング - JPNIC

問い合わせで使用するポート番号をランダム化して「ID + ポート番号」の組み合わせの可能性を広げることで不正な応答を見分けやすくします。

二つ目の対策は、送信元ポート番号をランダム化する対策である。

出典:令和3年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問2

DNSには、ソースポートランダマイゼーションというポートをランダム化する機能がくっついているので有効にしておく必要があります。

■(緊急)キャッシュポイズニング攻撃の危険性増加に伴う
DNSサーバーの設定再確認について(2014年4月15日公開)
~問い合わせUDPポートのランダム化の速やかな確認・対応を強く推奨~

(緊急)キャッシュポイズニング攻撃の危険性増加に伴うDNSサーバーの設定再確認について(2014年5月30日更新)

DNSSECを使って、ディジタル署名によってDNS応答の正当性を確認できます。

DNSSECに関する記述として,適切なものはどれか。

  1. DNSサーバへのDoS攻撃を防止できる。
  2. IPsecによる暗号化通信が前提となっている。
  3. 代表的なDNSサーバの実装であるBINDの代替として使用する。
  4. (答え)ディジタル署名によってDNS応答の正当性を確認できる。

出典:平成24年 秋期 情報セキュリティスペシャリスト試験午前Ⅱ 問18

DNSSECは、正式名称DNS Security(安全) Extensions(拡張機能)で、権威サーバからのDNS応答に電子署名を追加します。

DNSSECについての記述のうち,適切なものはどれか。

  1. DNSサーバへの問合せ時の送信元ポート番号をランダムに選択することによって,DNS問合せへの不正な応答を防止する。
  2. DNS再帰的な問合せの送信元として許可するクライアントを制限することによって,DNSを悪用したDoS攻撃を防止する。
  3. 共通鍵暗号方式によるメッセージ認証を用いることによって,正当なDNSサーバからの応答であることをクライアントが検証できる。
  4. (答え)公開鍵暗号方式によるディジタル署名を用いることによって,正当なDNSサーバからの応答であることをクライアントが検証できる。

出典:平成31年 春期 応用情報技術者試験 午前問40

電子署名を問い合わせ側で検証して、正しい権威サーバからの応答であるかを判断します。

DNSSECで実現できることはどれか。

  1. (答え)DNSキャッシュサーバからの応答中のリソースレコードが,権威DNSサーバで管理されているものであり,改ざんされていないことの検証
  2. 権威DNSサーバとDNSキャッシュサーバとの通信を暗号化することによる,ゾーン情報の漏えいの防止
  3. 長音"ー"と漢数字"一"などの似た文字をドメイン名に用いて,正規サイトのように見せかける攻撃の防止
  4. 利用者のURLの打ち間違いを悪用して,偽サイトに誘導する攻撃の検知

出典:情報セキュリティスペシャリスト試験 午前Ⅱ 問14

f:id:ponsuke_tarou:20210929072159j:plain
青梅の多摩川沿いにあるTeaRoomのマフィンは美味しい

次回の勉強内容

ponsuke-tarou.hatenablog.com

Backlogのフリープランでスペースを作る

Backlogは、見た目が可愛いくて多機能な課題管理ツールです。

backlog.com

Backlogにまつわるいろんな実験をする時に使うスペースが欲しいと思いました。そこで、Backlogのフリープランを使ってみようと思います。

フリープランでできることをおしえてください – Backlog ヘルプセンター を見ると作れるプロジェクトが1つだったり、親子課題を設定できなかったりと制限はあるものの無料でスペースを使わせてもらえるのはありがたい!

フリープランでアカウント作成します。

  1. https://backlog.com/ja/ を表示します
  2. f:id:ponsuke_tarou:20210803184135p:plain
    [プランと料金]を選択します。
  3. f:id:ponsuke_tarou:20210803184349p:plain
    ページの中程にある[フリープランはこちら]リンクで申し込み画面を表示します。
  4. f:id:ponsuke_tarou:20210803190306p:plain
  5. 既に他のBacklogで使っているメールアドレスでアカウントを作成したい場合は、最初に[メールアドレス]を入力します。
    1. f:id:ponsuke_tarou:20210803190541p:plain
      メッセージとリンクが表示されます。
    2. リンクからログインして、申し込み画面を再度表示すると[スペースID][組織名]の入力だけで済みます。
  6. 全ての項目を入力して[無料で試してみる]ボタンで進むとBacklogのスペースができます。
    • 組織名 : ここの入力値はスペース名になります
  7. f:id:ponsuke_tarou:20210803191625p:plain

f:id:ponsuke_tarou:20210803201920j:plain
ザ マンダリン オリエンタル グルメ ショップで食べたケーキ

使い方はヘルプサイトがわかりやすいです。

たくさんの画像付きでわかりやすいので使い方を調べるときはヘルプサイトがおすすめです。 support-ja.backlog.com

APIを使います。

developer.nulab.com

せっかくスペースを作ったので記念にスペース情報の取得 | Backlog Developer API | Nulabをします。 APIの認証で使うAPIキーの取得方法は、APIの設定 – Backlog ヘルプセンタが参考になります。 コマンドでAPIを呼び出すときは、合わせてjqコマンドを使うとレスポンスのJSONが整形されてみやすくなります。

$ curl -X GET https://{スペースID}.backlog.com/api/v2/space?apiKey={APIキー} | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   228  100   228    0     0   1868      0 --:--:-- --:--:-- --:--:--  1868
{
  "spaceKey": "{スペースID}",
  "name": "ぽんすぺーす",
  "ownerId": 5...,
  "lang": "ja",
  "timezone": "Asia/Tokyo",
  "reportSendTime": "00:00:00",
  "textFormattingRule": "markdown",
  "created": "2021-08-03T10:08:17Z",
  "updated": "2021-08-03T10:59:06Z"
}

f:id:ponsuke_tarou:20210803202030j:plain
ザ マンダリン オリエンタル グルメ ショップで食べた流行りもの

外の世界から守ってくれるプロキシ

前回の勉強内容

ponsuke-tarou.hatenablog.com

プロキシは、インターネットとの接続を中継してくれるサーバです。

プロキシは、単に「プロキシ」と言ったり「プロキシサーバ」と言ったりします。

Webアクセスで利用されるプロキシサーバの機能として,適切なものはどれか。

エ. 内部ネットワークのクライアントが外部サーバと通信する場合,中継役となりクライアントの代わりに外部サーバに接続する。

平成17年秋期問56 プロキシサーバの機能|基本情報技術者試験.com

社内ネットワークなど内部とインターネットなど外部の接続を中継してくれます。英語で書くと「proxy」で日本語に訳すと「代理人」になります。

TCP/IPネットワークのフォワードプロキシに関する説明のうち,最も適切なものはどれか。

ウ. Webブラウザの代理として,Webサーバに対するリクエストを送信する。

令和元年秋期問35 フォワードプロキシはどれか|応用情報技術者試験.com

インターネットは楽しいですが、怖い人々がたくさん待ち構えています。 そんな、怖い人々と直接やりとりするのは嫌なのでプロキシさんに代理人としてやりとりしてもらうのです(これはイメージです)。

f:id:ponsuke_tarou:20220315201145j:plain

「接続元」「接続先」によってフォワードプロキシとリバースプロキシがあります。

接続するパソコンが、内部ネットワークにあってインターネットに接続する時に、代理でインターネットに接続してくれるのがフォワードプロキシです。 英語で書くと「forward proxy」で「前方の + 代理人」になります。

Webサーバを使ったシステムにおいて,インターネット経由でアクセスしてくるクライアントから受け取ったリクエストをWebサーバに中継する仕組みはどれか。

エ. リバースプロキシ

https://www.ap-siken.com/kakomon/31_haru/img/35.gif

平成31年春期問35 Webサーバに中継する仕組みはどれか|応用情報技術者試験.com

Webサーバを作る人々にとっては、インターネットから接続し来る人々はどんな怖い人がいるか分からないので怖いものです。 だから、インターネットからWebサーバへの接続の時に代理人を立てます。これがリバースプロキシです。 英語で書くと「reverse proxy」で「反対の + 代理人」になります。

種類 接続元 接続先
フォワードプロキシ 内部ネットワークのクライアント インターネット上のサーバ
リバースプロキシ インターネット上のクライアント 内部ネットワークのサーバ

裁判をする時に訴える人も訴えられる人も弁護士さんを立てます。 訴える人と訴えられる人が、接続元のパソコンや接続先サーバで、弁護士さんがプロキシサーバ、みたいなイメージです(本当にイメージです)。

フォワードプロキシにはいろんな利点があります。

接続元PCの情報を外部に曝さずにインターネットを使えます。

プロキシサーバが接続元PCの代理としてインターネットに接続してくれるのでPC固有のIPアドレスなどの情報を晒さずに済みます。

https://www.infraexpert.com/studygif/security36.5.gif

プロキシサーバとは - infraexpert.com

ユーザー認証機能をくっつければ、認証した人だけがインターネットに接続できます。

プロキシサーバにユーザー認証を実装することで、登録されて認証できた人だけがインターネットを使えるようにすることができます。

キャッシュでよくみるページへのアクセスが速くなります。

プロキシサーバには、表示したページ情報をキャッシュしておく機能があり、同じページを再度表示する場合はキャッシュを使用することで素早くページを表示できます。

https://xtech.nikkei.com/it/article/COLUMN/20071102/286318/zu04_01.jpg

Lesson4:HTTPのやりとりを仲介するプロキシを使った流れを知ろう | 日経クロステック(xTECH)

フィルタリングで、怪しいサイトへの接続を禁止できます。

社内の決まり(ポリシー)に沿って、怪しいサイトへの接続を禁止することでPCへのマルウェアの侵入対策になります。

https://image.itmedia.co.jp/ait/articles/1608/31/sectecmap1.gif

プロキシサーバ/コンテンツフィルタ――ポリシーに合致しないアクセスの防止技術:セキュリティ・テクノロジー・マップ(6) - @IT

情報を一元管理できます。

内部ネットワークにあるPCは、みんなプロキシサーバを経由することになるので各自のインターネット接続情報が一元管理されることになります。 それにより、何か事故や問題が起こった時にプロキシサーバの記録をたどることで調査が可能になります。

リバースプロキシにも利点があります。

リバースプロキシでは、負荷分散を行なったり、プロキシで暗号化・復号を行うことによるSSL通信の高速化を図ることができます。

https://image.itmedia.co.jp/ait/articles/1608/25/wi-fig02.png

リバースプロキシ(Reverse Proxy):90秒の動画で学ぶITキーワード - @IT

f:id:ponsuke_tarou:20210802221445j:plain
板橋区志村の熊野湯

使っているPCに設定されたプロキシサーバを確認してみます。

Macの場合

[システム環境設定] > [ネットワーク] > [Wifi]などのインターフェースを選択 > [詳細]ボタン > [プロキシ]タブ、とたどっていくとみられます。 f:id:ponsuke_tarou:20210802222601p:plain

Windowsの場合

コマンドで確認したい場合は、コマンドプロンプトなどのターミナルを起動してnetsh winhttp show proxと打てばOKです。

# プロキシサーバーを使っていないとこんな感じ
$ netsh winhttp show prox

現在の WinHTTP プロキシ設定:

    直接アクセス (プロキシ サーバーなし)。

画面で見たい場合は、Win + X > [設定] > [Windowsの設定]ダイアログ表示 > [ネットワークとインターネット] > [プロキシ]とたどっていくとみられます。 f:id:ponsuke_tarou:20210803093434p:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

f:id:ponsuke_tarou:20220315201421j:plain

Kintoneでフィールドが非表示になる時と「アクセス権がありません。」と表示される時の違い

レコードの詳細画面でフィールが非表示になる時と「アクセス権がありません。」と表示される時があります。

f:id:ponsuke_tarou:20210630192402p:plain
こういうフィールドが、フィールドの権限設定によって
f:id:ponsuke_tarou:20210630192310p:plain
こんな感じで表示に違いがあります。

違いは、アクセス権の設定に「フォームのフィールド」を使っているかどうかです。

懇切丁寧に質問サイトに説明が書いてあります。

「フィールドのアクセス権」では、アクセス権を適用するユーザーの設定方法によって、該当ユーザーがアクセスした時の表示が変わります。

よくあるご質問 | フィールドのアクセス権を設定している場合、レコード詳細画面に「アクセス権がありません。」と表示される場合と、フィールド自体が非表示になる場合があります。

実際にやってみました。

理解力が低くてちょっとわからなかったのでやってみました。

使ったアプリは、社員名簿 - kintone(キントーン)- すぐに使えるサンプルアプリ | サイボウズの業務改善プラットフォームをちょっぴりいじったものです。

フィールドのアクセス権がこんな感じの場合

f:id:ponsuke_tarou:20210630192858p:plain

[閲覧]権限があるユーザーの表示

f:id:ponsuke_tarou:20210630191720p:plain

[閲覧]権限がないユーザーの表示

f:id:ponsuke_tarou:20210630193230p:plain

フィールドのアクセス権に「フォームのフィールド」だけ設定しても「アクセス権がありません。」と表示されました。

「フォームのフィールドを追加」から一つでもフィールドを追加して設定した場合

(省略)※ 該当フィールドに対して閲覧権限がないユーザーは、「アクセス権がありません。」と表示されます。

よくあるご質問 | フィールドのアクセス権を設定している場合、レコード詳細画面に「アクセス権がありません。」と表示される場合と、フィールド自体が非表示になる場合があります。

「ユーザー/組織/グループとアクセス権」を設定せず、「フォームのフィールド」だけ設定したらどうなるのだろう?とふと思ったのでやってみました。

f:id:ponsuke_tarou:20210630221512p:plain
フィールドのアクセス権がこんな感じの場合
f:id:ponsuke_tarou:20210630221606p:plain
[閲覧]権限があるユーザーの表示

やはり「アクセス権がありません。」と表示されました。

f:id:ponsuke_tarou:20210630221652p:plain
[閲覧]権限がないユーザーの表示
「フォームのフィールドを追加」から一つでもフィールドを追加して設定した場合は、「アクセス権がありません。」と表示されます。

ポイントは、「フォームのフィールド」

f:id:ponsuke_tarou:20210630193800p:plain f:id:ponsuke_tarou:20210630194047p:plain

f:id:ponsuke_tarou:20210630194320j:plain
港区にあるふれあいの湯

Kintoneで他のアプリからユーザー選択の値を取得する

やりたいこと

とあるアプリで、他のアプリから値を取得して任意のフィールドに設定したいのです。

  1. [社員名簿]アプリでは、「社員名」と「承認者」を紐づけている。
  2. [作業依頼申請]アプリでは、「申請者」とその「承認者」を入れる必要がある。

上記のような状態のアプリがあったとします。 [作業依頼申請]アプリで「承認者」を入力するのはとても面倒くさいので、[社員名簿]アプリから「承認者」を取得して設定したいです。 f:id:ponsuke_tarou:20210622213458j:plain

[社員名簿]アプリ

社員名簿 - kintone(キントーン)- すぐに使えるサンプルアプリ | サイボウズの業務改善プラットフォームを使っています。

f:id:ponsuke_tarou:20210622211206p:plain
[社員名]フィールドというユーザー選択フィールドを追加しています。
今回使うフィールドは以下です。

フィールド名 フィールドコード フィールドの種類
社員名 社員名 ユーザー選択
承認者 承認者 ユーザー選択

[作業依頼申請]アプリ

作業依頼申請 - kintone(キントーン)- すぐに使えるサンプルアプリ | サイボウズの業務改善プラットフォームを使っています。 f:id:ponsuke_tarou:20210622212125p:plain 今回使うフィールドは以下です。

フィールド名 フィールドコード フィールドの種類
申請者 applicant 作成者
承認者 authorizer ユーザー選択

JavaScriptを実装します。

レコード編集を始めるタイミングで処理を起動します。

kintone.events.on([
    'app.record.index.edit.show',
    'app.record.create.show',
    'app.record.edit.show'
], function(event) {

レコード編集を始めるタイミングで処理が動くようにイベントハンドラーを登録します。

イベントハンドラーを登録する

kintone.events.on(type, handler)

イベント処理の記述方法 – cybozu developer network

引数のtypeには以下のタイミングを指定します。

イベントが発生するタイミング イベントタイプ Promise対応
レコード一覧画面 - インライン編集開始 app.record.index.edit.show o
レコード追加画面 - 表示後 app.record.create.show o
レコード編集画面 - 表示後 app.record.edit.show o

表の参考元 : kintone JavaScript API(イベント)一覧 – cybozu developer network

APIの呼び出しを行うので、kintone.Promiseに対応したイベントを使います。

※ この kintone.Promise オブジェクトを return することで、kintone.api() の実行を待ってから次の処理を実行できるイベントがあります。 対応しているイベントはこちらをご参照ください。

kintone REST API リクエスト – cybozu developer network

他のアプリでの検索条件に使う値を取得する。

[社員名簿]アプリから情報を取得する検索条件に使う値を取得します。 処理を「新規作成」「新規作成以外(既に登録されているレコードの編集)」に分岐させています。

if (event.type === 'app.record.create.show') {
    // レコード追加時には、[申請者]フィールドにログインユーザーが設定されていないので、ログインユーザー情報を直接取得する
    user = kintone.getLoginUser().code;
} else {
    // [申請者]フィールドからユーザー情報を取得する
    user = event.record['applicant']['value']['code'];
}

検索条件に使用する[社員名簿]アプリの[申請者]フィールドには[作成者]を使用しています。

https://jp.cybozu.help/k/img-ja/created_by_01.png

レコードを保存したユーザーが自動で設定されるフィールドです。

作成者 - kintone ヘルプ

この[作成者]は、新規作成して初回保存時に設定されるようです。 ということで、「新規作成」の時はログインユーザーから情報を取得するようにしています。

Kintone REST APIで他のアプリからユーザー選択の値を取得する

APIを使って[社員名簿]アプリの[承認者]フィールドを取得します。検索条件は「[社員名簿]アプリの[社員名]フィールドが、[作業依頼申請]アプリの[申請者]フィールドと同じ」です。

let params = {
    app: 11,
    fields: ['承認者'],
    query: '社員名 in ("' + user + '")'
};

表の出典 : レコードの一括取得(クエリで条件を指定) – cybozu developer network

パラメータ名 指定する値 必須 説明
fields 文字列の配列 省略可 レスポンスに含めるフィールドコードを指定します。
省略した場合は、閲覧権限を持つすべてのフィールドの値が返されます。
app 数値又は文字列 必須 アプリのID を指定します。
query 文字列 省略可 レスポンスに含めるレコードの条件を指定するクエリ文字列です。 クエリ文字列内では、後述の演算子とオプションが使用できます。
省略した場合は、閲覧権限を持つすべてのレコードが返されます。

Kintone REST APIの呼び出しで、コールバック関数を指定する方法と省略する方法があります。 ここでは、コールバック関数を省略してkintone.Promise オブジェクトが返却されるようにします。

Promiseを使う利点

レコード作成時などに、処理を待ってからレコードを保存することができる(同期的処理、と呼びます) 「あるアプリAのレコードを保存時、アプリBのレコードを取得し、その値を利用」というようにレコードの保存時などにkintone APIを使って他のデータを取得したり変更したり、同期的に処理することができるようになります。

kintoneにおけるPromiseの書き方の基本 – cybozu developer network

そうすることで、APIを使って[社員名簿]アプリから取得したデータを画面のフィールドに反映させることができます。

return kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', params).then( function(resp) {
    // API の呼び出しが成功したら実行される処理...
    return event;
}).catch(function(error) {
    // API の呼び出しが失敗したら実行される処理...
    return event;
});

f:id:ponsuke_tarou:20210622214925j:plain

ソースファイルを登録すれば出来上がりです。

  1. [作業依頼申請]アプリの設定画面を開く
    • f:id:ponsuke_tarou:20210630184357p:plain
  2. f:id:ponsuke_tarou:20210630184514p:plain
    [設定]タブ > [JavaScript / CSSでカスタマイズ]リンクからJavaScriptを登録する画面を表示
  3. [適用範囲]=「すべてのユーザーに適用」を選択
  4. [PC用のJavaScriptファイル]の[アップロードして追加]ボタンで実装したソースファイルをアップロード
  5. f:id:ponsuke_tarou:20210630184802p:plain
    [保存]ボタンで保存
  6. f:id:ponsuke_tarou:20210630184935p:plain
    [アプリを更新]ボタンで適用する

できた!

f:id:ponsuke_tarou:20210630185439p:plain
[社員名簿]アプリにこんなレコードがあると・・・
こんな感じで、[作業依頼申請]アプリでレコードを追加したり編集すると[社員名簿]アプリから「承認者」を取得して自動で設定されるようになりました。 f:id:ponsuke_tarou:20210630185649g:plain

うまくいかなかったこと

APIで取得した結果を設定したのに反映されない!

原因 : ハンドラーが return してないから

return kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', params).then(function(resp) {
    // ...省略...
    event.record['authorizer']['value'] = userlist;
}).catch(function(error) {
    console.log(error.message);
});

フィールドの値を書き換える

ハンドラーが record オブジェクトのフィールドの値を書き換えて event オブジェクトを return した場合、その値でフィールドの値を更新します。

  • 最後のハンドラーが return しない場合、フィールドの値を更新しません。

レコード編集イベント – cybozu developer network

原因 : Promiseオブジェクトを使う方法じゃないから

return kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', params, function(resp) {
    // API の呼び出しが成功したら実行されるコールバック処理
    return event;
}, function(error) {
    // API の呼び出しが失敗したら実行されるコールバック処理
    return event;
});

コールバック関数を指定しており、kintone.Promise オブジェクトは返却されません。 というわけでなのでAPIを呼び出す処理が終わるのを待たずに画面表示処理が進んでしまいました。

このように kintone.api() はコールバック関数を省略するとPromiseオブジェクトが返り値になります。

kintone.api(kintone.api.url('/k/v1/record', true), 'GET', {app: 1, id: 1}); // これでPromiseオブジェクトが生成される

それを return してあげることによってkintone側で app.record.create.submit 時など、処理を待ってくれる仕組みをkintoneは持っています。Promiseオブジェクトを return しないと処理をまってくれないので注意しましょう。(逆に言えば、レコード詳細ページなど、処理を待たせる必要がなければPromiseオブジェクトの return は必須ではありません。)

kintoneにおけるPromiseの書き方の基本 – cybozu developer network

Failed to load resource: the server responded with a status of 400 (Bad Request) - 入力内容が正しくありません。

f:id:ponsuke_tarou:20210622185513p:plain
ブラウザのコンソールにエラーが出力された

  • 事象 : APIの呼び出しでエラー
  • 原因 : APIでの検索条件で文字列が"に囲まれていないから
  • 対応 : "で囲む
/** @type {object} API に渡すパラメータオブジェクト. */
let params = {
    app: 11,
    fields: ['承認者'],
    query: '社員名 in (' + user + ')' // 正解>>> '社員名 in ("' + user + '")'
};

520 (520) - 社員名フィールドのフィールドタイプには演算子=を使用できません。

  • 事象 : APIの呼び出しでエラー
  • 原因 : APIでの検索条件でユーザー選択フィールドに=演算子を使ったから
  • 対応 : ユーザー選択には、innot inを使う
/** @type {object} API に渡すパラメータオブジェクト. */
let params = {
    app: 11,
    fields: ['承認者'],
    query: '社員名 = "' + user + '"' // 正解>>> '社員名 in ("' + user + '")'
};
フィールド又はシステム識別子 利用可能な演算子 利用可能な関数
ユーザー選択 in not in LOGINUSER()

表の出典元 : フィールド、システム識別子ごとの利用可能な演算子と関数一覧 – cybozu developer network

f:id:ponsuke_tarou:20210622214554j:plain
PARADIS小石川本店のケーキ

Kintoneの基本機能だけで通知メールをちょっぴりカスタマイズする方法

Kintoneはなかなか便利なサービスです。

Kintoneはプログラミングの知識がなくても業務アプリを作れる便利なサービスです。

交通費申請や経費申請などの業務フローも[プロセス管理]の設定で細かく設定できます。

参考 : プロセス管理でできること - kintone ヘルプ

[プロセス管理]のなかで[ステータス]が更新されるとメール通知が送信されます。

ただ、メール通知は基本的に件名と本文が決まっています。

Q メール通知の本文を変更したいです。レコードのすべての情報を表示したいです。

A メール通知の本文を変更する機能は未搭載です。(省略)

よくあるご質問 | メール通知の本文を変更したいです。レコードのすべての情報を表示したいです。 - aq.cybozu.info

メール通知の件名は、メール通知の件名 - kintone ヘルプで確認できます。

メール通知に埋め込まれる[レコードのタイトル]だけは設定できます。

メール通知の件名と本文には、[レコードのタイトル]というものが埋め込まれます。 この[レコードのタイトル]に設定でるものにはいくつかあります。

レコードタイトルには、次の種類のフィールドを指定できます。

  • レコード番号
  • 文字列(1行)
  • 文字列(複数行)
  • リッチエディター
  • 数値
  • 計算
  • ルックアップ

レコードタイトルを設定する - kintone ヘルプ

[レコードのタイトル]に設定できる フィールドは1つ なのですが、とても便利なのでこの[レコードのタイトル]を利用してメール通知をちょっぴりカスタマイズしたいと思います。

通知メールに複数のフィールド情報を設定します。

Kintoneテンプレートにある[交通費申請]アプリをちょっぴりいじってやってみました。

f:id:ponsuke_tarou:20210618211104p:plain
例えばこんな風に入力した場合のお話です。

「タイトル」が設定されている場合の通知メール

テンプレートにある[交通費申請]アプリでは、[レコードのタイトル]に「タイトル」が設定されていました。

f:id:ponsuke_tarou:20210618223123p:plain
こんな感じにメール通知の件名と本文に「タイトル」が設定されます。

設定方法

今回は、メールに「社員番号」と「申請者」両方の情報があったらいいのに・・・という要望があったという想定です。

f:id:ponsuke_tarou:20210618223612p:plain
今回は、「社員番号」と「申請者」の情報をメール通知に設定します。

1. [レコードのタイトル]に設定するフィールドを作成します。

メール通知の件名に埋め込まれる文字になるので[文字列(1行)]フィールドでシンプルに作成します。 あまり長い文字列だとメールの件名が見にくくなっちゃいますからね。

参考 : フォームを設定する - kintone ヘルプ

ポイントは追加するフィールドで「メール通知に入れたい情報を文字列連携させる」ということです(というよりこれが全てです)。 文字列の連結方法は、[&演算子]文字や数値の結合 - kintone ヘルプに説明があるので参考にします。

f:id:ponsuke_tarou:20210618212721p:plain
こんなフィールドをアプリの設定で追加します。

ちなみに「社員番号」と「申請者」の設定は以下のようにしていました。

フィールドの種類 フィールド名 フィールドコード
数値 社員番号 fc_社員番号
作成者 申請者 fc_申請者

2. レコードのタイトルに作ったフィールドを設定します。

参考 : レコードタイトルを設定する - kintone ヘルプ f:id:ponsuke_tarou:20210618213104p:plain

3. 作ったフィールドを見えないように権限設定します。

作ったフィールドは、メール通知で使いたいだけなので入力する時に見る必要はないので、見えないように設定します。

参考 : フィールドにアクセス権を設定する - kintone ヘルプ

f:id:ponsuke_tarou:20210618214325p:plain
誰にも見えないように設定します([アプリの設定]では見えます)。

4. アプリを更新します。

f:id:ponsuke_tarou:20210618214513p:plain
このボタンを押下し忘れると変更が適用されません。

アプリを更新する前に設定した一部の内容は[アプリの動作テスト]から動かして確認することができます。 しかし、メール通知は送信されないので注意してください。

動作テスト環境でできないこと

テスト環境では、次の設定や操作はできません。(省略)

・通知は送信されません。

アプリの動作テストをする - kintone ヘルプ

このやり方は完璧ではありません。

今回ご紹介した方法では、メールの件名と本文を完全に任意の内容に変えられるわけではありません。 また、フォームに設定されたフィールドを使用するので通知を行う各アプリでそれぞれ設定しなければなりません

そして、Kintoneのメールをカスタマイズする方法はいくつかあります。

  1. 有料のプラグインやサービスを使う
  2. 自分で他のサービスと連携させる

しかし、メール通知を受信する人がメール通知を受信しないように設定できます。

https://jp.cybozu.help/k/img-ja/enable_mail_notification05.png

自分のメール通知の設定(ユーザー) - kintone ヘルプ

どんなにお金と時間と労力をかけても「メール通知を受信しないように設定」してたら・・・。

たとえ、外部サービスなどを利用してメール通知の設定に関わらずメールを送信できたとしても「受信しないように設定したのにメール送らないでよ!」と思われたら悲しいですよね。

そんな時は、今回ご紹介した完璧ではないけど簡単にできるやり方もカスタマイズの候補として考えてみてもいいかもしれません。

f:id:ponsuke_tarou:20210618234150j:plain
板橋区栄町の一の湯

web.xmlメモ用紙

内容を覚えられない・・・本に書いてある通りに書きたくてもクラス名が長くて書けない・・・ググるのが面倒くさい・・・だからメモしちゃう。 書き溜めておけばいつか役に立つって期待してる。

f:id:ponsuke_tarou:20210607223529j:plain
文京区本郷にあるほていやのお蕎麦は超ボリューミー

web-app

<?xml version="1.0" encoding="UTF-8"?>
<web-app {ここの書き方のメモ}>
</web-app>

Servlet 3.0

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0">

Servlet 4.0

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">

f:id:ponsuke_tarou:20210607223215j:plain
台東13の富久の湯(ふくのゆ)

servlet

<web-app ...>
  <servlet>
    {ここの書き方のメモ}
  </servlet>
  <servlet-mapping>
    {ここの書き方のメモ}
  </servlet-mapping>
</web-app>

Spring MVCのフロントコントローラを利用するための設定

  <!-- DispatcherServletクラスをサービレットコンテナに登録する -->
  <servlet>
    <servlet-name>api</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <!-- サーブレットのcontextClassパラメータにAnnotationConfigWebApplicationContextクラスを指定する -->
      <param-name>contextClass</param-name>
      <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </init-param>
    <init-param>
      <!-- サーブレットのcontextConfigLocationパラメータに作成した設定クラスを指定する -->
      <param-name>contextConfigLocation</param-name>
      <!-- AppConfigの内容は下記参照 -->
      <param-value>example.config.AppConfig</param-value>
    </init-param>
  </servlet>
  <!-- 定義したDispatcherServletを使用してリクエストをハンドリングするURLのパターンを指定する -->
  <servlet-mapping>
    <servlet-name>api</servlet-name>
    <!-- 全てのリクエストを定義したDispatcherServletを使用してハンドリングする -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
package example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
@ComponentScan("example")
public class AppConfig implements WebMvcConfigurer {
}

f:id:ponsuke_tarou:20210607221859j:plain
荒川2の千代の湯

filter

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
  <filter>
    {ここの書き方のメモ}
  </filter>
  <filter-mapping>
    {ここの書き方のメモ}
  </filter-mapping>
</web-app>

入力値の日本語が文字化けしないようにするための設定

  <!-- CharacterEncodingFilterクラスをサーブレットコンテナに登録する(入力値の日本語の文字化け対策用) -->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <!-- サーブレットのencodingパラメータにリクエストパラメータの文字エンコーディング(UTF-8)を指定する -->
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <!-- サーブレットのforceEncodingパラメータにリクエストおよびレスポンスのエンコーディング上書きするかを指定する -->
      <param-name>forceEncoding</param-name>
      <!-- true:encodingへ強制的に上書きされる -->
      <param-value>true</param-value>
    </init-param>
  </filter>
  <!-- CharacterEncodingFilterを適用するリクエストのURLパターンを指定する -->
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <!-- 全てのリクエストを適用対象にする -->
    <url-pattern>/*</url-pattern>
  </filter-mapping>

ISO 8859-1(ISO Latin 1)以外の文字を扱う必要がある場合は、CharacterEncodingFilterを使用して適切な文字エンコーディングの指定が必要です。 また、サーブレットフィルタを複数登録する場合は、リクエストパラメータから値を取得するサーブレットフィルタより前にフィルタ処理が適用されるように登録してください。 順番が逆転すると文字化けしてしまいます。

第4章Spring MVC - Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

HiddenHttpMethodFilter

HiddenHttpMethodFilterを使用すると、クライアントとの物理的な通信はPOSTメソッドを使用しますが、サーブレットコンテナ内ではリクエストパラメータで送られてきた値に置き換えて処理を行うことができます。

第6章RESTful Webサービスの開発 - Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

  <!-- HiddenHttpMethodFilterクラスをサーブレットコンテナに登録する -->
  <filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <!-- HiddenHttpMethodFilterを適用するとサーブレットコンテナ内でリクエストパラメータで送られてきた値に置き換えて処理を行うことができる -->
  <filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

f:id:ponsuke_tarou:20210607222706j:plain
板橋区板橋にある大むさしの卵とじそば

GitHubとSlackをSlackのアプリで連携させる方法

Slackのアプリを使ってGitHubを連携します。

slack.com

1. GitHubにSlackアプリをインストールします。

参考 : 個人アカウントでアプリケーションをインストールする - GitHub Docs

  1. 連携するGitHubアカウントにログインします。
  2. [Marketplace] > 「slack」でアプリを検索 > 「Slack + GitHub」を選択してページを表示します。
    • f:id:ponsuke_tarou:20210601211921p:plain
  3. [Install it for free]ボタンで次のページを表示します。
  4. [Complete order and begin installation]ボタンでインストールします。

f:id:ponsuke_tarou:20210601214036p:plain
アプリがインストールされているかは[Account settings]画面で確認できます

2. SlackにGitHubアプリをインストールします。

  1. Slack + GitHub のページを開いて、[Add to Slack]ボタンを押下します。
    • f:id:ponsuke_tarou:20210601211319p:plain
  2. 設定したいSlackのワークスペースになっていることを確認して[Allow]ボタンで進みます。
  3. Slackのメッセージが届いてワークスペースGitHubアプリが追加されます。
    • f:id:ponsuke_tarou:20210601211154p:plain

3. SlackでGitHubアカウントへの連携設定をします。

  1. 使いたいチャネルで /invite @GitHub を送信してGitHubアプリをチャネルに追加します。
  2. /github subscribe ユーザ名/リポジトリ名 を送信して、表示された[Connect GitHub account]ボタンでWeb画面を表示します。
  3. [Authorize Slack]ボタンを押下すると認証コードが画面に表示されます。
    • f:id:ponsuke_tarou:20210601214216p:plain
  4. Slackに表示された[Enter code]ボタンで認証コードを入力します。
    • f:id:ponsuke_tarou:20210601211715p:plain

GitHubアカウントへの連携を解除する方法

参考 : GitHubとSlackを連携させて通知を自動化するまでの手順 - zenn.dev

# 現在、何が連携されているかを確認します
ponsuke  10:31
/github subscribe list features

GitHubAPP  10:31
Subscribed to the following repository
ユーザ名/リポジトリ名
issues, pulls, commits, releases, deployments
Learn More

# unsubscribeで連携を解除します
ponsuke  10:34
/github unsubscribe ユーザ名/リポジトリ名

GitHubAPP  10:34
Unsubscribed from ユーザ名/リポジトリ名

うまくいかなかったこと

Either the app isn't installed on your repository or the repository does not exist. Install it to proceed.

f:id:ponsuke_tarou:20210601212409p:plain
事象 : GitHubリポジトリを連携したらメッセージが表示された

  • 原因 : GitHub 側で Slack アプリがインストールされていないから
  • 対応
    1. メッセージに表示された[Install GitHub App]ボタンでWeb画面を開きます。
    2. [Only select repositories]で通知したいリポジトリを選択します(複数選択可)。
      • f:id:ponsuke_tarou:20210601213543p:plain
        リポジトリにインストールしたい場合は、[All repositories]を選択します。
    3. [Install]ボタンでインストールします。

Workspaces on free subscriptions can only install 10 apps and your workspace has reached the limit.

2020年3月頃にGitHubとSlackを連携させました。 ある日、GitHubと連携するアプリを使っているチャネルにこんな通知が来ました。 f:id:ponsuke_tarou:20210506104208p:plain

Action required - upgrade app for {ワークスペース名}.
GitHub app is built on Slack's workspace apps which are now deprecated. The legacy GitHub app will stop working on July 15, 2021.
Don't worry, we have built a new version of GitHub-Slack integration. You can just upgrade the app and get back to your work.
Learn more about this upgrade here.
(なんとなくの訳)
GitHubアプリは非推奨になって2021-07-15に使えなくなるよ。
でも新しいアプリがあるからアップグレードすればOKよ。

というわけで対応しようと、通知にある[Upgrade App]ボタンから進んでいくと・・・。 f:id:ponsuke_tarou:20210506195913p:plain

アプリ

インストールできるサードパーティ製アプリやカスタムアプリは最大 10 個です。

Slack フリープランでのメッセージ、ファイルやアプリの制限 | Slack

有料プランから無料プランへプラン変更したワークスペースのためか、インストールされている「アプリ」と「インテグレーション」の合計数が10個をがっつり超えていました。

SlackのGitHubアプリをアップグレードしよう(2021年7月15日まで) | DevelopersIOを参考にすると通知にある[Upgrade App]ボタンからぽちぽちすればアップグレードできるようですが、今回はワークスペースにインストールするアプリの上限に達しているため一旦古いGitHubアプリを削除して再度新しいGitHubアプリで設定することにしました。

  1. Slackをブラウザで表示 > [Manage]
  2. [GitHub (Legacy)]をアンインストールする
    1. [Installed apps]タブ > 一覧から[GitHub (Legacy)]を選択して画面を表示
    2. [Settings] > [Warkspace access] > [Uninstall app]でポップアップを表示
    3. 「アプリが使えなくなっちゃうって理解しているよ」チェックボックス2つにチェックを入れる
      • チェックすると[Uninstall app]ボタンが活性化する
    4. [Uninstall app]ボタンでアプリをアンインストールする
  3. 他の不要なアプリやをインテグレーションをアンインストール

f:id:ponsuke_tarou:20220315200506j:plain
41歳のお誕生日ケーキ

PostgreSQLのpsqlをインストールする

PostgreSQLの本体じゃなくてコマンドだけが欲しい時のお話です。

以前、MacPostgreSQLをインストールして使ったことがありました。 ponsuke-tarou.hatenablog.com 今回は、自分のパソコンじゃなくてサーバにあるPostgreSQLにコマンドで接続したいです。 なので、PostgreSQL本体が欲しいのではなくコマンドだけが欲しいのです。

Windows

インストールする

  1. Download PostgreSQL Database for Windows, Linux and MacOS & 32-bit or 64-bit Versions | EDBをブラウザで表示する
  2. 任意のバージョンのWindowsのところにある[Download]ボタンからexeファイルをダウンロードする
  3. ダウンロードしたexeファイルを起動する
  4. f:id:ponsuke_tarou:20210427112448p:plain
    しばし待つ
  5. f:id:ponsuke_tarou:20210427112600p:plain
    [Next]ボタンで進む
  6. f:id:ponsuke_tarou:20210427112949p:plain
    インストール先を指定する
  7. f:id:ponsuke_tarou:20210427113018p:plain
    [Command Line Tools]だけにチェックを入れる
  8. f:id:ponsuke_tarou:20210427113049p:plain
    [Next]ボタンで進む
  9. f:id:ponsuke_tarou:20210427113108p:plain
    [Next]ボタンで進む
  10. f:id:ponsuke_tarou:20210427113120p:plain
    しばし待つ
  11. f:id:ponsuke_tarou:20210427113142p:plain
    [Finish]ボタンでダイアログを閉じる

パスを通す

パスは、使っているシェルや環境によって設定がちょっぴり違います。 今回は、コマンドプロンプトpsqlコマンドを使うので、システムのプロパティから環境変数PATHに設定します。

  1. Win + R > sysdm.cplを入力 > Enterで[システムのプロパティ]ダイアログを開く
  2. [詳細設定]タブ > [環境変数...] > [ユーザー環境変数]か[システム環境変数]の[Path]を選択 > [編集]ボタンでダイアログを開く
  3. [新規]ボタン > {インストール先フォルダ}\binを入力 > [OK]ボタンでダイアログを閉じる
# 環境変数PATHに設定されました
>echo %path%
...省略...C:\apps\PostgreSQL\10\bin;...省略...

# psqlコマンドが使えるようになりました
>psql -V
psql (PostgreSQL) 10.16

# データベースへはこんな感じで接続できます(切断はCtrl+C)
# psql -h {ホスト} -p {ポート} -U {ユーザー} -d {データベース}
>psql -h example.com -p 5432 -U ponsuke -d my_db
psql (10.16, server 9.3.10)
Type "help" for help.

my_db=#
psqlのオプション 意味
-h {ホスト}
--host={ホスト}
サーバを実行しているマシンのホスト名を指定
-p {ポート}
--port={ポート}
サーバが接続監視を行っているTCPポートもしくはローカルUnixドメインソケットファイルの拡張子
環境変数PGPORTの値、環境変数が設定されていない場合はコンパイル時に指定した値(通常は5432)がデフォルト値
-U {ユーザー}
--username={ユーザー}
接続するユーザーを指定
-d {データベース}
--dbname={データベース}
接続するデータベースの名前
-c {コマンド}
--command={コマンド}
実行するコマンド
-cまたは-fが指定されると、psqlは標準入力からコマンドを読み取りません。
その代わりに、すべての-cオプションおよび-fオプションを順に処理した後、終了します。
-f {ファイル}
--file={ファイル}
コマンドを読み取るファイルを指定

上記表の出典 : psql - PostgreSQL 12.4文書

f:id:ponsuke_tarou:20210429105512j:plain
板橋区幸町の第二富士見湯

Windows以外

いつか・・・やった時に書きます。

AESは電子政府推奨暗号リストに載ってる共通鍵暗号方式

前回の勉強内容

ponsuke-tarou.hatenablog.com

AESは、暗号化の規格です。

  • 正式名称 : Advanced(高度な) Encryption(暗号化) Standard(標準)

アメリカで標準規格として採用されていたDESにとって変わって登場した暗号化方式です。

暗号化と復号で同じ鍵を使う共通鍵暗号方式です。

暗号方式に関する記述のうち,適切なものはどれか。

  1. AESは公開鍵暗号方式RSA共通鍵暗号方式の一種である。
  2. 共通鍵暗号方式では,暗号化及び復号に同一の鍵を使用する。
  3. 公開鍵暗号方式を通信内容の秘匿に使用する場合は,暗号化に使用する鍵を秘密にして,復号に使用する鍵を公開する。
  4. ディジタル署名公開鍵暗号方式が使用されることはなく,共通鍵暗号方式が使用される。

平成29年秋期問41 暗号方式に関する記述|応用情報技術者試験.com

使う鍵の組み合わせはこんな感じです。

使う鍵 共通鍵暗号方式 公開鍵暗号方式
暗号化 共通鍵 公開鍵
復号 共通鍵 秘密鍵

f:id:ponsuke_tarou:20210413225125j:plain

暗号方式のうち,共通鍵暗号方式はどれか。

  1. AES
  2. ElGamal暗号
  3. RSA
  4. 楕円曲線暗号

平成28年春期問37 共通鍵暗号方式はどれか|応用情報技術者試験.com

データベースで管理されるデータの暗号化に用いることができ,かつ,暗号化と復号とで同じ鍵を使用する暗号化方式はどれか。

  1. AES
  2. PKI
  3. RSA
  4. SHA-256

平成27年春期問39 同じ鍵を使用する暗号化方式|基本情報技術者試験.com

上記過去問の選択肢を分類するとこんな感じです。

問題の選択肢 共通鍵
暗号方式
公開鍵
暗号方式
暗号方式じゃない
AES o
ElGamal暗号 o
RSA o
楕円曲線暗号 o
PKI PKIは、暗号化技術と電子署名で世の中の安全を守る仕組みです。
SHA-256 ハッシュ関数です。

データを決まった長さに区切って暗号化するブロック暗号です。

ブロック暗号は、元のデータを決まった長さに区切って、その区切った単位ごとに暗号化します。
この区切ったデータをブロックと言います。
AESでは、このブロックの長さ(ブロック長)を128bitで分けています。
f:id:ponsuke_tarou:20210413225305j:plain
もう一つストリーム暗号という方式があります。
ストリーム暗号は、元のデータを端から1bitまたは1byte単位で次々に暗号化します。
端からバンバン暗号化するのでデータを全部受信していなくてもさくさく暗号化できちゃいます。
だから、早い!

が、ブロック暗号の方が研究が進んでいて安全だそうです。
研究が進んでいるおかげかAESは、早いそうです。

ブロック暗号 ストリーム暗号
暗号化の単位 ブロック 1bitまたは1byte
逐次生 o
安全性 o
暗号方式 DES, AES RC4

f:id:ponsuke_tarou:20210415202903j:plain
荒川区の藤の湯

電子政府推奨暗号リストは、安全性及び実装性能が確認された暗号方式を載せたリストです。

暗号化技術の安全性を評価したりしている、CRYPTRECというプロジェクトがあります。

  • 正式名称 : Cryptography(暗号技術) Research(調査) and Evaluation(評価) Committees(委員会)

CRYPTREC とはCryptography Research and Evaluation Committees の略であり、電子政府推奨暗号の安全性を評価・監視し、暗号技術の適切な実装法・運用法を調査・検討するプロジェクトである。
CRYPTREC | CRYPTRECとは

このCRYPTRECから「電子政府推奨暗号リスト」というものが出されています。

電子政府推奨暗号リストとは,CRYPTRECによって安全性及び実装性能が確認された暗号技術のうち,市場における利用実績が十分であるか今後の普及が見込まれると判断され,当該技術の利用を推奨するもののリストである。
平成27年春期問8 CRYPTREC 暗号リスト|情報処理安全確保支援士.com

AESは、安全性及び実装性能が確認された暗号方式です。

CRYPTREC | CRYPTREC暗号リスト(電子政府推奨暗号リスト)にあるPDFで「電子政府推奨暗号リスト」を確認すると(2021-04-13時点)
共通鍵暗号」の「128ビットブロック暗号」のところにAESが載っています。

ということで、「CRYPTRECにより安全性及び実装性能が確認された暗号方式」ということですね。

AESは、鍵長が長いほど暗号文は解読されにくくなります。

鍵長は、そのままの意味で鍵の長さ(単位はbit)です。
AESでは、暗号化で使う共通鍵の鍵長が「128bit」「192bit」「256bit」から選べます。
悪い人が共通鍵を総当たりで割り出そうとした時に「0」「1」の組み合わせといえど長くなれば長くなるほど大変になるわけですね。

AES-256で暗号化されていることが分かっている暗号文が与えられているとき,ブルートフォース攻撃で鍵と解読した平文を得るまでに必要な試行回数の最大値はどれか。

  1. 256
  2. 2^{128}
  3. 2^{255}
  4. 2^{256}

平成30年秋期問37 ブルートフォース攻撃の試行回数|基本情報技術者試験.com

ブルートフォース攻撃は、根性で不正ログインを頑張る総当たり攻撃です。
ブルートフォース攻撃をする悪い人は、復号する共通鍵をどんどん変えて復号を頑張ります。
鍵長が「256bit」の「0」「1」の組み合わせパターンを頑張って鍵を見つけるために最大2^{256}回鍵を変えて復号を試し続けることになるのです。
頑張りますね。

AESの特徴は、「鍵長によって段数が決まる」です。

AESの特徴はどれか。

  1. 鍵長によって,段数が決まる。
  2. 段数は,6回以内の範囲で選択できる。
  3. データの暗号化,復号,暗号化の順に3回繰り返す。
  4. 同一の公開鍵を用いて暗号化を3回繰り返す。

平成29年春期問1 AESの特徴はどれか|情報処理安全確保支援士.com

暗号化では、ラウンド関数という関数を繰り返し処理します。
その関数を処理する回数を段数とかラウンド数といい、この数が多いほど強度の高い暗号文になります。

鍵長と段数の組み合わせ

鍵長 段数
128bit 10
192bit 12
256bit 14

というわけで、「使う共通鍵の鍵長が大きい」->「暗号化の段数が多い」->「解読されにくい暗号文ができる」ということになります。

f:id:ponsuke_tarou:20210415203026j:plain
豊島区の前田湯はお花屋さんと一緒になっている

最後にAESで暗号化と復号をしてみます。

参考 : コマンドラインで簡単にAES暗号化、または Java での AES 暗号化 - 理系学生日記

# Macに入っているopensslコマンドを使います。
$ openssl version
LibreSSL 2.8.3

# 使えるAESの暗号方式をみてみます。
$ openssl list-cipher-commands | grep aes
aes-128-cbc
aes-128-ecb
aes-192-cbc
aes-192-ecb
aes-256-cbc
aes-256-ecb

# 鍵長256bitの共通鍵を使ったAESで暗号化します。
$ echo "ponsuke" | openssl aes-256-cbc -e -base64 -p -pass pass:password
salt=1CD83F097F07009C
key=8E71364EB09F97B6BACAC68B1EB944FC416CE8EBBF81E8B2681667AEE7991D63  # << 共通鍵
iv =68F150FA9F95D8590F8FE50002A1571E
U2FsdGVkX18c2D8JfwcAnEg69cNx1g30btqEdInz7TQ=   # << 暗号化された暗号文

# 暗号文を復号します。
$ echo "U2FsdGVkX18c2D8JfwcAnEg69cNx1g30btqEdInz7TQ=" | openssl aes-256-cbc -d -base64 -pass pass:password
ponsuke

f:id:ponsuke_tarou:20210415203128j:plain
板橋区大和町の愛染湯

次回の勉強内容

ponsuke-tarou.hatenablog.com