DNS CAAは、不正なサーバ証明書の発行を防ぎます。
前回の勉強内容
DNS CAAは、不正なサーバ証明書の発行を防ぎます。
DNSにおいてDNS CAA(Certification Authority Authorization)レコードを使うことによるセキュリティ上の効果はどれか。
- WebサイトにアクセスしたときのWebブラウザに鍵マークが表示されていれば当該サイトが安全であることを,利用者が確認できる。
- Webサイトにアクセスする際のURLを短縮することによって,利用者のURLの誤入力を防ぐ。
- 電子メールを受信するサーバでスパムメールと誤検知されないようにする。
- 不正なサーバ証明書の発行を防ぐ。 << 正解
出典 : 令和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とは
次回の勉強内容
DNS水責め攻撃は、オープンリゾルバを利用して権威DNSサーバを過負荷にします。
前回の勉強内容
DNS水責め攻撃は、オープンリゾルバを利用して権威DNSサーバを過負荷にします。
DNS水責め攻撃(ランダムサブドメイン攻撃)の手口と目的に関する記述のうち,適切なものはどれか。
- ISPが管理するDNSキャッシュサーバに対して,送信元を攻撃対象のサーバのIPアドレスに詐称してランダムかつ大量に生成したサブドメイン名の問合せを送り,その応答が攻撃対象のサーバに送信されるようにする。
- オープンリゾルバとなっているDNSキャッシュサーバに対して,攻撃対象のドメインのサブドメイン名をランダムかつ大量に生成して問い合わせ,攻撃対象の権威DNSサーバを過負荷にさせる。 << 正解
- 攻撃対象のDNSサーバに対して,攻撃者が管理するドメインのサブドメイン名をランダムかつ大量に生成してキャッシュさせ,正規のDNSリソースレコードを強制的に上書きする。
- 攻撃対象のWebサイトに対して,当該ドメインのサブドメイン名をランダムかつ大量に生成してアクセスし,非公開のWebページの参照を試みる。
出典 : 平成29年 春期 情報処理安全確保支援士 午前Ⅱ 問6
ランダムな存在しないサブドメイン名を生成して大量に問い合わせるので「ランダムサブドメイン攻撃」とも言います。
DNS水責め攻撃(ランダムサブドメイン攻撃)の方法はどれか。
- 標的のキャッシュサーバに,ランダムかつ大量に生成した偽のサブドメインのDNS情報を注入する。
- 標的の権威DNSサーバに,ランダムかつ大量に生成した存在しないサブドメイン名を問い合わせる。 << 正解
- 標的のサーバに,ランダムに生成したサブドメインのDNS情報を格納した,大量のDNSレスポンスを送り付ける。
- 標的のサーバに,ランダムに生成したサブドメインのDNS情報を格納した,データサイズが大きいDNSレスポンスを送り付ける。
出典 : 平成30年 春期 データベーススペシャリスト 午前Ⅱ 問20
次回の勉強内容
IEEE802.1Xとそのプロトコル達
前回の勉強内容
IEEE802.1Xは、ユーザ認証とアクセス制御を行うプロトコルの規格です。
知らない人が、ネットワークに接続してこないようにユーザ認証とアクセス制御をするプロトコルの規格です。
IEEE802.1Xで認証を行うためには、「サプリカント」「認証装置」「認証サーバ」を使用します。
構成要素 | 英語表記 | 立場 | 機器 |
---|---|---|---|
サプリカント | Supplicant | 認証クライアント | パソコンなどのクライアントにインストールされるソフトウェア |
認証装置 | Authenticator | サプリカントと認証サーバの仲介役 | スイッチや無線LAN |
認証サーバ | Authentication Server | 認証を行うサーバ | RADIUSなど |
無線LAN環境に複数台のPC、複数台のアクセスポイント及び利用者認証情報を管理する1台のサーバがある。利用者認証とアクセス制御にIEEE802.1XとRADIUSを利用する場合の特徴はどれか。
- PCにはIEEE802.1Xのサプリカントを実装し、RADIUSクライアントの機能をもたせる。 << 正解
- アクセスポイントにはIEEE802.1Xのオーセンティケータを実装し、RADIUSクライアントの機能をもたせる。
- アクセスポイントにはIEEE802.1Xのサプリカントを実装し、RADIUSサーバの機能をもたせる。
- サーバにはIEEE802.1Xのオーセンティケータを実装し、RADIUSサーバの機能をもたせる。
出典 : 平成25年 春期 情報セキュリティスペシャリスト試験 午前Ⅱ 問7
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によって実現される認証はどれか。
- CHAPを用いたチャレンジレスポンスによる利用者認証 << EAP-MD5の説明
- あらかじめ登録した共通鍵によるサーバ認証と,時刻同期のワンタイムパスワードによる利用者認証 << EAP-TTLSの説明
- ディジタル証明書による認証サーバとクライアントの相互認証
- 利用者IDとパスワードによる利用者認証
出典 : 平成24年 秋期 情報セキュリティスペシャリスト試験 午前Ⅱ 問2
CHAPはパスワードをハッシュ化するプロトコルです。
英語では「Challenge-Handshake Authentication(認証) Protocol」です。
サーバへパスワードを送信する時にそのまま平文で送ると危ないので、「チャレンジ」と「パスワード」を合わせてハッシュ化します。
「チャレンジ」は、ランダムな短いデータのことです。
次回の勉強内容
Visual Studio CodeとDockerを使ってでVue.jsをやってみる
環境 : macOS Monterey バージョン12.2.1
準備する
- Visual Studio Codeを準備する
- Visual Studio Codeをインストールする
- [View] > [Extensions] > 「Remote-Containers」を検索してインストールする
- Docker Desktopをインストールする
コンテナを作る
- 任意の場所にDocker環境用のディレクトリを作成する
- 今回は、
~/docker/vue
というディレクトリにしてみた
- 今回は、
Shift + Command + P
> [Remote-Containers: Open Folder in Container…] > 作成したディレクトリを選択する- [Show All Definitions...] > 「vue」を入力して表示された
Vue (Community)
を選択する - Node.jsのバージョンを選択する(今回はdefaultの「16」にした)
- 追加で欲しいものがあれば選択する > [OK]を押下するとコンテナが作成される
- コンテナに入っている状態のVisual Studio Codeが開く
プロジェクトを作る
Vue CLIでvue 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.
ディジタルフォレンジックスでサイバー犯罪を科学捜査
前回の勉強内容
ディジタルフォレンジックスは、電子機器で犯罪の証拠を捜査する手法です。
外部からの不正アクセスによるコンピュータに関する犯罪の疑いが生じた。そのとき,関係する機器やデータ,ログなどの収集及び分析を行い,法的な証拠性を明らかにするための手段や技術の総称はどれか。
ディジタルフォレンジックスは、digital forensics(科学捜査)です。
多岐にわたるサーバー犯罪の証拠を集めて保全して分析する科学捜査の手法です。
ディジタルフォレンジックスの説明として,適切なものはどれか。
目的には、犯罪の原因追求だけではなく責任の所在を明らかにしたりと裁判に向けた備えもあります。
ディジタルフォレンジックスに該当するものはどれか。
- 画像や音楽などのディジタルコンテンツに著作権者などの情報を埋め込む。
- コンピュータやネットワークのセキュリティ上の弱点を発見するテスト手法の一つであり,システムを実際に攻撃して侵入を試みる。
- ネットワーク管理者や利用者などから,巧みな話術や盗み聞き,盗み見などの手段によって,パスワードなどのセキュリティ上重要な情報を入手する。
- (答え)犯罪に関する証拠となり得るデータを保全し,その後の訴訟などに備える。
出典 : 令和2年 秋期 情報処理安全確保支援士試験 午前Ⅱ 問13
証拠となり得るデータを「保全」「収集」「分析」します。
犯罪が発生したら「現場保存」とよくドラマでも言っています。
犯罪の対象となったコンピュータなどの電子機器における犯罪発生時点のデータをきっちり「保全」します。
犯罪によっては、データを勝手に削除するので削除履歴などからデータ復元もして証拠を「収集」します。
ディジタルフォレンジックスの手順を収集,検査,分析,報告に分けたとき,そのいずれかに該当するものはどれか。
ハッシュ関数を使って「収集」したデータのコピーからハッシュ値を得ておいて、原本のハッシュ値と比較して一切変更されていないことを確認できるようにしておきます。
そうすると、後で情報開示や裁判の時に証拠をきっちり「保全」していることを証明できます。
ディジタルフォレンジックスでハッシュ値を利用する目的として,適切なものはどれか。
- 一方向性関数によってパスワードを復元できないように変換して保存する。
- 改変されたデータを,証拠となり得るように復元する。
- (答え)証拠となり得るデータについて,原本と複製の同一性を証明する。
- パスワードの盗聴の有無を検証する。
次回の勉強内容
押し寄せるDNSへの攻撃
前回の勉強内容
DNSは、ドメイン名やホスト名などとIPアドレスとを対応付けます。
DNSは、「ドメイン名」を受け取ってから「IPアドレス」を返したり、「IPアドレス」を受け取って「ホスト名」を返したりと「ドメイン名やホスト名」と「IPアドレス」の紐付けをしてくれます。
正式名称は、Domain(領域) Name(名前) Systemです。
こんな便利なDNSは、いろんな種類の攻撃を受けます。
「令和3年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問2」を参考にDNSへの攻撃をお勉強します。
DNSに反射させるDNSリフレクション攻撃
DNSリフレクション攻撃は、送信元のIPアドレスを偽装してDNSへ大量の問い合わせを行います。
IPアドレスは、攻撃対象のIPアドレスに偽装します。
そうするとDNSは、攻撃対象のIPアドレスに大量の応答を返すので攻撃対象が過負荷に陥ってしまいます。
攻撃者は、②送信元の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を使うのです。
- (答え)DNSリフレクタ攻撃
- SQLインジェクション攻撃
- ディレクトリトラバーサル攻撃
- パスワードリスト攻撃
出典:平成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)の踏み台にされることを防止する対策はどれか。
- (答え)キャッシュサーバとコンテンツサーバに分離し,インターネット側からキャッシュサーバに問合せできないようにする。
- 問合せされたドメインに関する情報をWhoisデータベースで確認する。
- 一つのDNSレコードに複数のサーバのIPアドレスを割り当て,サーバへのアクセスを振り分けて分散させるように設定する。
- 他のDNSサーバから送られてくるIPアドレスとホスト名の対応情報の信頼性をディジタル署名で確認するように設定する。
出典:平成24年 春期 情報セキュリティスペシャリスト試験 午前Ⅱ 問14
キャッシュポイズニング攻撃
フルサービスリゾルバ(キャッシュサーバー)では、問い合わせ内容を覚えておきます(キャッシュ)。
こうすることで、内容と同じ問い合わせがまた来た時にキャッシュの情報を送信元へ返して、何度も権威DNSサーバに問い合わせなくて済むようにしています。
このキャッシュを蓄積する機能を利用して、悪い人が嘘の情報をキャッシュとして蓄積されるようにするのがキャッシュポイズニング攻撃です。
DNSキャッシュポイズニングに分類される攻撃内容はどれか。
- DNSサーバのソフトウェアのバージョン情報を入手して,DNSサーバのセキュリティホールを特定する。
- (答え)PCが参照するDNSサーバに誤ったドメイン情報を注入して,偽装されたWebサーバにPCの利用者を誘導する。
- 攻撃対象のサービスを妨害するために,攻撃者がDNSサーバを踏み台に利用して再帰的な問合せを大量に行う。
- 内部情報を入手するために,DNSサーバが保存するゾーン情報をまとめて転送させる。
出典:平成29年 秋期 基本情報技術者試験 午前 問37
なぜ、「嘘の情報」をキャッシュとして蓄積されるようにするかというと
「嘘の情報」として偽サイトや偽サーバに誘導して情報を盗もうとするからです。
M社のショッピングサイトにアクセスしていた福岡営業所の社員Aさんから、①「ホームページのリンクをクリックしてショッピングサイトにアクセスしようとしたところ、いつも表示されるショッピングサイトとは違うサイトが表示された。」という報告が東京本社に入った。
平成22年度春期 応用情報技術者試験 午後 問9
DNSキャッシュポイズニング攻撃が成功すると、攻撃対象のフルサービスリゾルバが管理するリソースレコードのうち、メールサーバのAレコードのIPアドレスが、例えば攻撃者のメールサーバのものに書き換えられてしまい、電子メールが攻撃者のサーバに送信されてしまう。
出典:令和3年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問2
再帰的な問合せに対しては、内部ネットワークからのものだけに応答するように設定します。
DNSキャッシュサーバに対して外部から行われるキャッシュポイズニング攻撃への対策のうち,適切なものはどれか。
- 外部ネットワークからの再帰的な問合せにも応答できるように,コンテンツサーバにキャッシュサーバを兼ねさせる。
- (答え)再帰的な問合せに対しては,内部ネットワークからのものだけに応答するように設定する。
- 再帰的な問合せを行う際の送信元のポート番号を固定する。
- 再帰的な問合せを行う際のトランザクションIDを固定する。
出典:平成29年 春期 応用情報技術者試験 午前 問41
DNSヘッダ内のIDはランダムに変更します。
DNSの問い合わせの仕組みとして、キャッシュサーバは、権威サーバに問い合わせを送る時にIDを合わせて送ります。
権威サーバから応答が返ってきた時に自分が送ったIDと同じIDがメッセージに指定されていれば、正しい応答だと信じます。
自分が送ったIDと違うIDがメッセージに指定されていれば、不正な応答だと思って捨ててしまいます。
なので問い合わせする時に指定するIDはランダムにしておかないと悪い人に悪用されてしまいます。
DNSキャッシュポイズニング攻撃に対して有効な対策はどれか。
- DNSサーバで,マルウェアの侵入をリアルタイムに検知する。
- (答え)DNS問合せに使用するDNSヘッダ内のIDを固定せずにランダムに変更する。
- DNS問合せに使用する送信元ポート番号を53番に固定する。
- 外部からのDNS問合せに対しては,宛先ポート番号53のものだけに応答する。
出典:平成28年 春期 情報セキュリティスペシャリスト 午前Ⅱ 問12
カミンスキー攻撃は、進化したキャッシュポイズニング攻撃です。
カミンスキーさんが発見したカミンスキー攻撃は、「ランダム文字列」と「乗っ取り対象のドメイン名」を合わせることで、わざとキャッシュにない情報でフルサービスリゾルバが権威DNSサーバに問い合わせを行うようにします。
そして、すかさず偽情報をフルサービスリゾルバに送りつけることで効率的に偽情報をキャッシュさせます。
再帰的な問合せを行う際の送信元のポート番号をランダム化します。
UDPは、「情報の偽装が容易にできる」できてしまうので、権威サーバのふりをして問い合わせで使用するIDも偽装してくることがあります。
キャッシュサーバから権威サーバへ問い合わせるときに使用するUDPポート番号を、固定あるいは狭い範囲で使用するのではなく、広範囲な番号からランダムに選択して通信に使用することによって、応答パケットの偽装を難しくさせる方法です。偽装の難易度は、ポート番号の利用範囲に比例して難しくなります(図7)。
問い合わせで使用するポート番号をランダム化して「ID + ポート番号」の組み合わせの可能性を広げることで不正な応答を見分けやすくします。
二つ目の対策は、送信元ポート番号をランダム化する対策である。
出典:令和3年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問2
DNSには、ソースポートランダマイゼーションというポートをランダム化する機能がくっついているので有効にしておく必要があります。
■(緊急)キャッシュポイズニング攻撃の危険性増加に伴う
DNSサーバーの設定再確認について(2014年4月15日公開)
~問い合わせUDPポートのランダム化の速やかな確認・対応を強く推奨~
DNSSECを使って、ディジタル署名によってDNS応答の正当性を確認できます。
DNSSECに関する記述として,適切なものはどれか。
- DNSサーバへのDoS攻撃を防止できる。
- IPsecによる暗号化通信が前提となっている。
- 代表的なDNSサーバの実装であるBINDの代替として使用する。
- (答え)ディジタル署名によってDNS応答の正当性を確認できる。
出典:平成24年 秋期 情報セキュリティスペシャリスト試験午前Ⅱ 問18
DNSSECは、正式名称DNS Security(安全) Extensions(拡張機能)で、権威サーバからのDNS応答に電子署名を追加します。
DNSSECについての記述のうち,適切なものはどれか。
電子署名を問い合わせ側で検証して、正しい権威サーバからの応答であるかを判断します。
DNSSECで実現できることはどれか。
- (答え)DNSキャッシュサーバからの応答中のリソースレコードが,権威DNSサーバで管理されているものであり,改ざんされていないことの検証
- 権威DNSサーバとDNSキャッシュサーバとの通信を暗号化することによる,ゾーン情報の漏えいの防止
- 長音"ー"と漢数字"一"などの似た文字をドメイン名に用いて,正規サイトのように見せかける攻撃の防止
- 利用者のURLの打ち間違いを悪用して,偽サイトに誘導する攻撃の検知
出典:情報セキュリティスペシャリスト試験 午前Ⅱ 問14
次回の勉強内容
Backlogのフリープランでスペースを作る
Backlogは、見た目が可愛いくて多機能な課題管理ツールです。
Backlogにまつわるいろんな実験をする時に使うスペースが欲しいと思いました。そこで、Backlogのフリープランを使ってみようと思います。
フリープランでできることをおしえてください – Backlog ヘルプセンター を見ると作れるプロジェクトが1つだったり、親子課題を設定できなかったりと制限はあるものの無料でスペースを使わせてもらえるのはありがたい!
フリープランでアカウント作成します。
- https://backlog.com/ja/ を表示します
- 既に他のBacklogで使っているメールアドレスでアカウントを作成したい場合は、最初に[メールアドレス]を入力します。
- リンクからログインして、申し込み画面を再度表示すると[スペースID][組織名]の入力だけで済みます。
- 全ての項目を入力して[無料で試してみる]ボタンで進むとBacklogのスペースができます。
- 組織名 : ここの入力値はスペース名になります
使い方はヘルプサイトがわかりやすいです。
たくさんの画像付きでわかりやすいので使い方を調べるときはヘルプサイトがおすすめです。 support-ja.backlog.com
APIを使います。
せっかくスペースを作ったので記念にスペース情報の取得 | 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" }
外の世界から守ってくれるプロキシ
前回の勉強内容
プロキシは、インターネットとの接続を中継してくれるサーバです。
プロキシは、単に「プロキシ」と言ったり「プロキシサーバ」と言ったりします。
Webアクセスで利用されるプロキシサーバの機能として,適切なものはどれか。
エ. 内部ネットワークのクライアントが外部サーバと通信する場合,中継役となりクライアントの代わりに外部サーバに接続する。
社内ネットワークなど内部とインターネットなど外部の接続を中継してくれます。英語で書くと「proxy」で日本語に訳すと「代理人」になります。
TCP/IPネットワークのフォワードプロキシに関する説明のうち,最も適切なものはどれか。
インターネットは楽しいですが、怖い人々がたくさん待ち構えています。 そんな、怖い人々と直接やりとりするのは嫌なのでプロキシさんに代理人としてやりとりしてもらうのです(これはイメージです)。
「接続元」「接続先」によってフォワードプロキシとリバースプロキシがあります。
接続するパソコンが、内部ネットワークにあってインターネットに接続する時に、代理でインターネットに接続してくれるのがフォワードプロキシです。 英語で書くと「forward proxy」で「前方の + 代理人」になります。
Webサーバを使ったシステムにおいて,インターネット経由でアクセスしてくるクライアントから受け取ったリクエストをWebサーバに中継する仕組みはどれか。
エ. リバースプロキシ
Webサーバを作る人々にとっては、インターネットから接続し来る人々はどんな怖い人がいるか分からないので怖いものです。 だから、インターネットからWebサーバへの接続の時に代理人を立てます。これがリバースプロキシです。 英語で書くと「reverse proxy」で「反対の + 代理人」になります。
種類 | 接続元 | 接続先 |
---|---|---|
フォワードプロキシ | 内部ネットワークのクライアント | インターネット上のサーバ |
リバースプロキシ | インターネット上のクライアント | 内部ネットワークのサーバ |
裁判をする時に訴える人も訴えられる人も弁護士さんを立てます。 訴える人と訴えられる人が、接続元のパソコンや接続先サーバで、弁護士さんがプロキシサーバ、みたいなイメージです(本当にイメージです)。
フォワードプロキシにはいろんな利点があります。
接続元PCの情報を外部に曝さずにインターネットを使えます。
プロキシサーバが接続元PCの代理としてインターネットに接続してくれるのでPC固有のIPアドレスなどの情報を晒さずに済みます。
ユーザー認証機能をくっつければ、認証した人だけがインターネットに接続できます。
プロキシサーバにユーザー認証を実装することで、登録されて認証できた人だけがインターネットを使えるようにすることができます。
キャッシュでよくみるページへのアクセスが速くなります。
プロキシサーバには、表示したページ情報をキャッシュしておく機能があり、同じページを再度表示する場合はキャッシュを使用することで素早くページを表示できます。
フィルタリングで、怪しいサイトへの接続を禁止できます。
社内の決まり(ポリシー)に沿って、怪しいサイトへの接続を禁止することでPCへのマルウェアの侵入対策になります。
プロキシサーバ/コンテンツフィルタ――ポリシーに合致しないアクセスの防止技術:セキュリティ・テクノロジー・マップ(6) - @IT
情報を一元管理できます。
内部ネットワークにあるPCは、みんなプロキシサーバを経由することになるので各自のインターネット接続情報が一元管理されることになります。 それにより、何か事故や問題が起こった時にプロキシサーバの記録をたどることで調査が可能になります。
リバースプロキシにも利点があります。
リバースプロキシでは、負荷分散を行なったり、プロキシで暗号化・復号を行うことによるSSL通信の高速化を図ることができます。
使っているPCに設定されたプロキシサーバを確認してみます。
Macの場合
[システム環境設定] > [ネットワーク] > [Wifi]などのインターフェースを選択 > [詳細]ボタン > [プロキシ]タブ、とたどっていくとみられます。
Windowsの場合
コマンドで確認したい場合は、コマンドプロンプトなどのターミナルを起動してnetsh winhttp show prox
と打てばOKです。
# プロキシサーバーを使っていないとこんな感じ
$ netsh winhttp show prox
現在の WinHTTP プロキシ設定:
直接アクセス (プロキシ サーバーなし)。
画面で見たい場合は、Win + X
> [設定] > [Windowsの設定]ダイアログ表示 > [ネットワークとインターネット] > [プロキシ]とたどっていくとみられます。
次回の勉強内容
Kintoneでフィールドが非表示になる時と「アクセス権がありません。」と表示される時の違い
レコードの詳細画面でフィールが非表示になる時と「アクセス権がありません。」と表示される時があります。
違いは、アクセス権の設定に「フォームのフィールド」を使っているかどうかです。
懇切丁寧に質問サイトに説明が書いてあります。
「フィールドのアクセス権」では、アクセス権を適用するユーザーの設定方法によって、該当ユーザーがアクセスした時の表示が変わります。
よくあるご質問 | フィールドのアクセス権を設定している場合、レコード詳細画面に「アクセス権がありません。」と表示される場合と、フィールド自体が非表示になる場合があります。
実際にやってみました。
理解力が低くてちょっとわからなかったのでやってみました。
使ったアプリは、社員名簿 - kintone(キントーン)- すぐに使えるサンプルアプリ | サイボウズの業務改善プラットフォームをちょっぴりいじったものです。
フィールドのアクセス権がこんな感じの場合
[閲覧]権限があるユーザーの表示
[閲覧]権限がないユーザーの表示
フィールドのアクセス権に「フォームのフィールド」だけ設定しても「アクセス権がありません。」と表示されました。
「フォームのフィールドを追加」から一つでもフィールドを追加して設定した場合
(省略)※ 該当フィールドに対して閲覧権限がないユーザーは、「アクセス権がありません。」と表示されます。
よくあるご質問 | フィールドのアクセス権を設定している場合、レコード詳細画面に「アクセス権がありません。」と表示される場合と、フィールド自体が非表示になる場合があります。
「ユーザー/組織/グループとアクセス権」を設定せず、「フォームのフィールド」だけ設定したらどうなるのだろう?とふと思ったのでやってみました。
やはり「アクセス権がありません。」と表示されました。 「フォームのフィールドを追加」から一つでもフィールドを追加して設定した場合は、「アクセス権がありません。」と表示されます。
ポイントは、「フォームのフィールド」
Kintoneで他のアプリからユーザー選択の値を取得する
やりたいこと
とあるアプリで、他のアプリから値を取得して任意のフィールドに設定したいのです。
- [社員名簿]アプリでは、「社員名」と「承認者」を紐づけている。
- [作業依頼申請]アプリでは、「申請者」とその「承認者」を入れる必要がある。
上記のような状態のアプリがあったとします。 [作業依頼申請]アプリで「承認者」を入力するのはとても面倒くさいので、[社員名簿]アプリから「承認者」を取得して設定したいです。
[社員名簿]アプリ
社員名簿 - kintone(キントーン)- すぐに使えるサンプルアプリ | サイボウズの業務改善プラットフォームを使っています。 今回使うフィールドは以下です。
フィールド名 | フィールドコード | フィールドの種類 |
---|---|---|
社員名 | 社員名 | ユーザー選択 |
承認者 | 承認者 | ユーザー選択 |
[作業依頼申請]アプリ
作業依頼申請 - kintone(キントーン)- すぐに使えるサンプルアプリ | サイボウズの業務改善プラットフォームを使っています。 今回使うフィールドは以下です。
フィールド名 | フィールドコード | フィールドの種類 |
---|---|---|
申請者 | 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)
引数の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() の実行を待ってから次の処理を実行できるイベントがあります。 対応しているイベントはこちらをご参照ください。
他のアプリでの検索条件に使う値を取得する。
[社員名簿]アプリから情報を取得する検索条件に使う値を取得します。 処理を「新規作成」「新規作成以外(既に登録されているレコードの編集)」に分岐させています。
if (event.type === 'app.record.create.show') { // レコード追加時には、[申請者]フィールドにログインユーザーが設定されていないので、ログインユーザー情報を直接取得する user = kintone.getLoginUser().code; } else { // [申請者]フィールドからユーザー情報を取得する user = event.record['applicant']['value']['code']; }
検索条件に使用する[社員名簿]アプリの[申請者]フィールドには[作成者]を使用しています。
レコードを保存したユーザーが自動で設定されるフィールドです。
この[作成者]は、新規作成して初回保存時に設定されるようです。 ということで、「新規作成」の時はログインユーザーから情報を取得するようにしています。
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を使って他のデータを取得したり変更したり、同期的に処理することができるようになります。
そうすることで、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; });
ソースファイルを登録すれば出来上がりです。
- [作業依頼申請]アプリの設定画面を開く
- [適用範囲]=「すべてのユーザーに適用」を選択
- [PC用のJavaScriptファイル]の[アップロードして追加]ボタンで実装したソースファイルをアップロード
-
- 公開する前にアプリの動作テストをすることもできます。(参考 : アプリの動作テストをする - kintone ヘルプ)
できた!
こんな感じで、[作業依頼申請]アプリでレコードを追加したり編集すると[社員名簿]アプリから「承認者」を取得して自動で設定されるようになりました。
うまくいかなかったこと
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 しない場合、フィールドの値を更新しません。
原因 : 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 は必須ではありません。)
Failed to load resource: the server responded with a status of 400 (Bad Request) - 入力内容が正しくありません。
/** @type {object} API に渡すパラメータオブジェクト. */ let params = { app: 11, fields: ['承認者'], query: '社員名 in (' + user + ')' // 正解>>> '社員名 in ("' + user + '")' };
520 (520) - 社員名フィールドのフィールドタイプには演算子=を使用できません。
/** @type {object} API に渡すパラメータオブジェクト. */ let params = { app: 11, fields: ['承認者'], query: '社員名 = "' + user + '"' // 正解>>> '社員名 in ("' + user + '")' };
フィールド又はシステム識別子 | 利用可能な演算子 | 利用可能な関数 |
---|---|---|
ユーザー選択 | in not in |
LOGINUSER() |
表の出典元 : フィールド、システム識別子ごとの利用可能な演算子と関数一覧 – cybozu developer network
Kintoneの基本機能だけで通知メールをちょっぴりカスタマイズする方法
Kintoneはなかなか便利なサービスです。
Kintoneはプログラミングの知識がなくても業務アプリを作れる便利なサービスです。
交通費申請や経費申請などの業務フローも[プロセス管理]の設定で細かく設定できます。
参考 : プロセス管理でできること - kintone ヘルプ
[プロセス管理]のなかで[ステータス]が更新されるとメール通知が送信されます。
ただ、メール通知は基本的に件名と本文が決まっています。
Q メール通知の本文を変更したいです。レコードのすべての情報を表示したいです。
A メール通知の本文を変更する機能は未搭載です。(省略)
よくあるご質問 | メール通知の本文を変更したいです。レコードのすべての情報を表示したいです。 - aq.cybozu.info
メール通知の件名は、メール通知の件名 - kintone ヘルプで確認できます。
メール通知に埋め込まれる[レコードのタイトル]だけは設定できます。
メール通知の件名と本文には、[レコードのタイトル]というものが埋め込まれます。 この[レコードのタイトル]に設定でるものにはいくつかあります。
レコードタイトルには、次の種類のフィールドを指定できます。
- レコード番号
- 文字列(1行)
- 文字列(複数行)
- リッチエディター
- 数値
- 計算
- ルックアップ
[レコードのタイトル]に設定できる フィールドは1つ なのですが、とても便利なのでこの[レコードのタイトル]を利用してメール通知をちょっぴりカスタマイズしたいと思います。
通知メールに複数のフィールド情報を設定します。
Kintoneテンプレートにある[交通費申請]アプリをちょっぴりいじってやってみました。
「タイトル」が設定されている場合の通知メール
テンプレートにある[交通費申請]アプリでは、[レコードのタイトル]に「タイトル」が設定されていました。
設定方法
今回は、メールに「社員番号」と「申請者」両方の情報があったらいいのに・・・という要望があったという想定です。
1. [レコードのタイトル]に設定するフィールドを作成します。
メール通知の件名に埋め込まれる文字になるので[文字列(1行)]フィールドでシンプルに作成します。 あまり長い文字列だとメールの件名が見にくくなっちゃいますからね。
ポイントは追加するフィールドで「メール通知に入れたい情報を文字列連携させる」ということです(というよりこれが全てです)。 文字列の連結方法は、[&演算子]文字や数値の結合 - kintone ヘルプに説明があるので参考にします。
ちなみに「社員番号」と「申請者」の設定は以下のようにしていました。
フィールドの種類 | フィールド名 | フィールドコード |
---|---|---|
数値 | 社員番号 | fc_社員番号 |
作成者 | 申請者 | fc_申請者 |
2. レコードのタイトルに作ったフィールドを設定します。
参考 : レコードタイトルを設定する - kintone ヘルプ
3. 作ったフィールドを見えないように権限設定します。
作ったフィールドは、メール通知で使いたいだけなので入力する時に見る必要はないので、見えないように設定します。
参考 : フィールドにアクセス権を設定する - kintone ヘルプ
4. アプリを更新します。
アプリを更新する前に設定した一部の内容は[アプリの動作テスト]から動かして確認することができます。 しかし、メール通知は送信されないので注意してください。
動作テスト環境でできないこと
テスト環境では、次の設定や操作はできません。(省略)
・通知は送信されません。
このやり方は完璧ではありません。
今回ご紹介した方法では、メールの件名と本文を完全に任意の内容に変えられるわけではありません。 また、フォームに設定されたフィールドを使用するので通知を行う各アプリでそれぞれ設定しなければなりません。
そして、Kintoneのメールをカスタマイズする方法はいくつかあります。
- 有料のプラグインやサービスを使う
- 自分で他のサービスと連携させる
しかし、メール通知を受信する人がメール通知を受信しないように設定できます。
どんなにお金と時間と労力をかけても「メール通知を受信しないように設定」してたら・・・。
たとえ、外部サービスなどを利用してメール通知の設定に関わらずメールを送信できたとしても「受信しないように設定したのにメール送らないでよ!」と思われたら悲しいですよね。
そんな時は、今回ご紹介した完璧ではないけど簡単にできるやり方もカスタマイズの候補として考えてみてもいいかもしれません。
web.xmlメモ用紙
内容を覚えられない・・・本に書いてある通りに書きたくてもクラス名が長くて書けない・・・ググるのが面倒くさい・・・だからメモしちゃう。 書き溜めておけばいつか役に立つって期待してる。
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">
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 { }
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>
GitHubとSlackをSlackのアプリで連携させる方法
Slackのアプリを使ってGitHubを連携します。
1. GitHubにSlackアプリをインストールします。
参考 : 個人アカウントでアプリケーションをインストールする - GitHub Docs
- 連携するGitHubアカウントにログインします。
- [Marketplace] > 「slack」でアプリを検索 > 「Slack + GitHub」を選択してページを表示します。
- [Install it for free]ボタンで次のページを表示します。
- [Complete order and begin installation]ボタンでインストールします。
2. SlackにGitHubアプリをインストールします。
- Slack + GitHub のページを開いて、[Add to Slack]ボタンを押下します。
- 設定したいSlackのワークスペースになっていることを確認して[Allow]ボタンで進みます。
- Slackのメッセージが届いてワークスペースにGitHubアプリが追加されます。
3. SlackでGitHubアカウントへの連携設定をします。
- 使いたいチャネルで
/invite @GitHub
を送信してGitHubアプリをチャネルに追加します。 /github subscribe ユーザ名/リポジトリ名
を送信して、表示された[Connect GitHub account]ボタンでWeb画面を表示します。- [Authorize Slack]ボタンを押下すると認証コードが画面に表示されます。
- Slackに表示された[Enter code]ボタンで認証コードを入力します。
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.
- 原因 : GitHub 側で Slack アプリがインストールされていないから
- 対応
Workspaces on free subscriptions can only install 10 apps and your workspace has reached the limit.
2020年3月頃にGitHubとSlackを連携させました。 ある日、GitHubと連携するアプリを使っているチャネルにこんな通知が来ました。
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]ボタンから進んでいくと・・・。
アプリ
インストールできるサードパーティ製アプリやカスタムアプリは最大 10 個です。
有料プランから無料プランへプラン変更したワークスペースのためか、インストールされている「アプリ」と「インテグレーション」の合計数が10個をがっつり超えていました。
SlackのGitHubアプリをアップグレードしよう(2021年7月15日まで) | DevelopersIOを参考にすると通知にある[Upgrade App]ボタンからぽちぽちすればアップグレードできるようですが、今回はワークスペースにインストールするアプリの上限に達しているため一旦古いGitHubアプリを削除して再度新しいGitHubアプリで設定することにしました。
- Slackをブラウザで表示 > [Manage]
- 対象のワークスペースが右上に表示されていることを確認する
- [GitHub (Legacy)]をアンインストールする
- 他の不要なアプリやをインテグレーションをアンインストール
- 削除方法はアプリの種類などによって少し異なるので以下を参考にアンインストールする
- アプリは以下2つの画面に表示されるものの合計10個までをインストールできる(いまいち分かってなくてSlackにお問い合わせしてしまいました。)
- カスタムインテグレーション: https://my.slack.com/apps/manage/custom-integrations
- アプリ : https://my.slack.com/apps/manage ([Installed apps]タブにあるアプリ)
PostgreSQLのpsqlをインストールする
PostgreSQLの本体じゃなくてコマンドだけが欲しい時のお話です。
以前、MacにPostgreSQLをインストールして使ったことがありました。 ponsuke-tarou.hatenablog.com 今回は、自分のパソコンじゃなくてサーバにあるPostgreSQLにコマンドで接続したいです。 なので、PostgreSQL本体が欲しいのではなくコマンドだけが欲しいのです。
Windows
- 環境
- Windows 10 Pro バージョン1909
- 接続先 : PostgreSQL 9.3.10
インストールする
- Download PostgreSQL Database for Windows, Linux and MacOS & 32-bit or 64-bit Versions | EDBをブラウザで表示する
- 任意のバージョンのWindowsのところにある[Download]ボタンからexeファイルをダウンロードする
- ダウンロードしたexeファイルを起動する
パスを通す
パスは、使っているシェルや環境によって設定がちょっぴり違います。
今回は、コマンドプロンプトでpsql
コマンドを使うので、システムのプロパティから環境変数PATHに設定します。
Win + R
>sysdm.cpl
を入力 > Enterで[システムのプロパティ]ダイアログを開く- [詳細設定]タブ > [環境変数...] > [ユーザー環境変数]か[システム環境変数]の[Path]を選択 > [編集]ボタンでダイアログを開く
- [新規]ボタン >
{インストール先フォルダ}\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文書
Windows以外
いつか・・・やった時に書きます。
AESは電子政府推奨暗号リストに載ってる共通鍵暗号方式
- 前回の勉強内容
- AESは、暗号化の規格です。
- 電子政府推奨暗号リストは、安全性及び実装性能が確認された暗号方式を載せたリストです。
- AESは、鍵長が長いほど暗号文は解読されにくくなります。
- 最後にAESで暗号化と復号をしてみます。
- 次回の勉強内容
前回の勉強内容
AESは、暗号化の規格です。
- 正式名称 : Advanced(高度な) Encryption(暗号化) Standard(標準)
昔アメリカで標準規格として採用されていたDESにとって変わって登場した暗号化方式です。
暗号化と復号で同じ鍵を使う共通鍵暗号方式です。
暗号方式に関する記述のうち,適切なものはどれか。
使う鍵の組み合わせはこんな感じです。
使う鍵 | 共通鍵暗号方式 | 公開鍵暗号方式 |
---|---|---|
暗号化 | 共通鍵 | 公開鍵 |
復号 | 共通鍵 | 秘密鍵 |
暗号方式のうち,共通鍵暗号方式はどれか。
データベースで管理されるデータの暗号化に用いることができ,かつ,暗号化と復号とで同じ鍵を使用する暗号化方式はどれか。
上記過去問の選択肢を分類するとこんな感じです。
問題の選択肢 | 共通鍵 暗号方式 |
公開鍵 暗号方式 |
暗号方式じゃない |
---|---|---|---|
AES | o | ||
ElGamal暗号 | o | ||
RSA | o | ||
楕円曲線暗号 | o | ||
PKI | PKIは、暗号化技術と電子署名で世の中の安全を守る仕組みです。 | ||
SHA-256 | ハッシュ関数です。 |
データを決まった長さに区切って暗号化するブロック暗号です。
ブロック暗号は、元のデータを決まった長さに区切って、その区切った単位ごとに暗号化します。
この区切ったデータをブロックと言います。
AESでは、このブロックの長さ(ブロック長)を128bitで分けています。
もう一つストリーム暗号という方式があります。
ストリーム暗号は、元のデータを端から1bitまたは1byte単位で次々に暗号化します。
端からバンバン暗号化するのでデータを全部受信していなくてもさくさく暗号化できちゃいます。
だから、早い!
が、ブロック暗号の方が研究が進んでいて安全だそうです。
研究が進んでいるおかげかAESは、早いそうです。
ブロック暗号 | ストリーム暗号 | |
---|---|---|
暗号化の単位 | ブロック | 1bitまたは1byte |
逐次生 | o | |
安全性 | o | |
暗号方式 | DES, AES | RC4 |
電子政府推奨暗号リストは、安全性及び実装性能が確認された暗号方式を載せたリストです。
暗号化技術の安全性を評価したりしている、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で暗号化されていることが分かっている暗号文が与えられているとき,ブルートフォース攻撃で鍵と解読した平文を得るまでに必要な試行回数の最大値はどれか。
- 256
ブルートフォース攻撃は、根性で不正ログインを頑張る総当たり攻撃です。
ブルートフォース攻撃をする悪い人は、復号する共通鍵をどんどん変えて復号を頑張ります。
鍵長が「256bit」の「0」「1」の組み合わせパターンを頑張って鍵を見つけるために最大回鍵を変えて復号を試し続けることになるのです。
頑張りますね。
AESの特徴は、「鍵長によって段数が決まる」です。
AESの特徴はどれか。
- 鍵長によって,段数が決まる。
- 段数は,6回以内の範囲で選択できる。
- データの暗号化,復号,暗号化の順に3回繰り返す。
- 同一の公開鍵を用いて暗号化を3回繰り返す。
暗号化では、ラウンド関数という関数を繰り返し処理します。
その関数を処理する回数を段数とかラウンド数といい、この数が多いほど強度の高い暗号文になります。
鍵長と段数の組み合わせ
鍵長 | 段数 |
---|---|
128bit | 10 |
192bit | 12 |
256bit | 14 |
というわけで、「使う共通鍵の鍵長が大きい」->「暗号化の段数が多い」->「解読されにくい暗号文ができる」ということになります。
最後に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