Apacheを触ってみる

  • 環境
    • OS : macOS Mojave バージョン10.14.1
    • Apatche : 2.4.37 (Unix)

Apacheは、Webサーバです。

  • 正式名称 : Apache HTTP Server

Apacheという名前はインディアン部族、Apacheに対する敬意の念をあらわすため選んだ」らしいです。
Webサーバで利用されているアプリケーションで、Netcraft社によるとシェアはここ数年下がりつつあるとはいえそれなりにあります。
Web Server Survey | Netcraft

Webサーバは、HTMLファイルやそれに付随する画像などのファイルをクライアントコンピュータに配信するサーバコンピュータのことです。

https://eng-entrance.com/wp-content/uploads/2016/05/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2016-05-25-7.58.03.png
今更聞けない!Webサーバーの仕組みと構築方法

f:id:ponsuke_tarou:20181219233515p:plain
第8回 Webサーバーを作る(Apache) « shell-mag

http://www.atmarkit.co.jp/fjava/special/ejb01/zu03.gif
Webアプリケーションにおけるサーバ・サイドJavaの効果的な利用

Apacheの利点

  1. 多彩なプラットフォーム
    • UNIXWindowsIBMOS/2Mac OS Xなどで動作します。だから特別な環境を用意しなくったって今使っているものが使えちゃうんです。
  2. オープンソース
    • オープンソースのため、興味があれば誰でもソースコードを見ることができます。そのため、常に外部から多くの人の目でチェックされ、改良を続けることでApacheの安定性は高まっています。
    • オープンソースがゆえに、商用製品のような手厚いサポートを受けることはできませが、コミュニティなどやサイトが沢山あるので情報は容易く手に入るのです!
  3. 機能が豊富
    • Apacheは機能を積極的に追加・拡張・機能をモジュールとして分割し、ユーザが新機能を開発するためのAPIも公開しています。このAPIを利用した追加モジュールがユーザによって数多く作成され、公開されています。そのため有用な機能を提供するモジュールはApacheの配布パッケージに含まれることもあるのです。

インストールの方法

qiita.com

起動と停止の方法

ターミナルを使います。

# 起動する
$ apachectl start

# 停止する
$ apachectl restart

# 再起動する
$ apachectl restart

Apacheを起動してからブラウザで「http://localhost:80」を表示すると「It works!」と表示されます。
f:id:ponsuke_tarou:20181227133522p:plain

Apacheを設定してみる

どこに「It works!」が書かれているのでしょう?こういった情報はApacheの設定ファイルで確認できます。

設定ファイルの名前は「httpd.conf」です。

設定ファイルは、Macにデフォルトで入っているApacheの場合は「/etc/apache2/httpd.conf」です。ただ「etc」というディレクトリは「Finder」では見えないのでターミナルで開きます。

$ open /etc/apache2/

アクセスするポート番号をListenに設定します。

#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
設定するポート番号の注意 : 80番はよく他のアプリケーションに使われています。

環境によっては「It works!」が表示されない事があります。原因は沢山あるのですが、1つにポート番号があります。

例えば、「Listen 80」と httpd.conf に設定したとします。これはApacheが 80番 のポートを使いますよってことです。

ところが、意外と他のアプリケーションが 80番を使っていてApacheが80番を使えず起動できないことがあります。
qiita.com

まずは現在使われているポート番号を調べます。
Macでは Network Utility を使います。
f:id:ponsuke_tarou:20181210211746p:plain

何のアプリケーションとポート番号がバッティングしているか判ったら方法は2つ
① 使っているアプリのポート番号を変更する
Apacheのポート番号を変更する

②の場合は、「Listen 80」の 80 を変更します。
「8080」あたりが無難です。

そして、Apacheを再起動するとポート番号のバッティングが治ります。

表示するファイルを格納するディレクトリをDocumentRootに設定します。

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/Library/WebServer/Documents"


「/Library/WebServer/Documents」を開いてみると「index.html」というファイルが入っています。ここに「It works!」が書かれています。

< html >< body><h1 >It works!</h1></body></html>
DirectoryIndexに設定されたファイルがデフォルトで表示されます。

ここまででDocumentRootに設定されたディレクトリにある「index.html」が表示されたことがわかりました。
この「index.html」を指定するのがDirectoryIndexになります。
http://localhost:80/」のようにファイル名が指定されない場合はDirectoryIndexに設定されたファイル名が返されて「http://localhost:80/index.html」となります。

#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

r7kamura.hatenablog.com

f:id:ponsuke_tarou:20181219233806j:plain

PHPでの変数名の決め方

ルール1:変数名の前には$をつける

じゃぁ「$34」でいい?

ルール2:$の次はアルファベットかアンダースコアから始める

じゃぁ「$A-34」でいい?

ルール3:使えるのは「aからz」「AからZ」「_」(厳密にはもっとあります。)

じゃぁ「$A_34」でどうだ
PHP: 基本的な事 - Manual

ルール4:規約には従いましょう。

みんなてんでばらばらだったら他の人が見てさっぱり分からない・・・ただ、規約っていっぱいあるし・・・・。
なので基本的なマナーレベルは押さえましょう。

マナー1:大文字と小文字の違いだけの変数名を分けて使わない。

「$a_34」「$A_34」読む人も誤記なんだかわざとなんだか・・・分かりにくい。次に書く時だって・・・・間違いやすい。

マナー2:名前に明確な単語を選んで情報を詰め込む

「$A_34」は何に使うためにこの変数を作っているか不明です。
実は、自分の年齢をこの変数に入れたかった・・・のであれば「$myoldis34」みたいな。

マナー3:誤解されない名前にする

年齢は毎年変わります・・・今の年齢を表したければ「$nowmyold」な感じ。

マナー4:読みやすく単語の区切れが分かるように。

単語の区切り方は、Pascal形式とかCamelCaseとかスネーク形式とかいろいろあって規約ごとに違います。
ここは「_」でつなぐスネーク形式で「$now_my_old」な感じ。

f:id:ponsuke_tarou:20181210195305j:plain

超ざっくりPHPってこんなもの

PHPはWebページ作成するサーバサイドのプログラミング言語です。

PHPがないWebサイトを表示する流れ

  1. [www.sample.com/monkey.html]をロケーションバーに入力してEnter!
  2. ブラウザは「www.sample.com」さんへ「monkey.htmlをくれ」、っと要求します。
  3. 「www.sample.com」さんのApache(Webサーバプログラム)は、monkey.htmというファイルlを探してブラウザへ渡します。
  4. ブラウザはもらったmonkey.htmlをHTMLタグに従って表示します。

PHPがあるWebサイトだとWebサーバの中で「いろいろやって」くれます。

2. で要求されたファイルをPHPが「いろいろやって」造ってくれるのです。
3. にある、「www.sample.com」さんのApacheの中でただファイルを探すのではなく、
入力された情報や状態に合わせて「いろいろやって」くれます。

たとえば、
・ 入力された内容をデータベースに保存する(アンケートページや会員登録ページとか)
・ メールを送る(予約ページとか)
・ ユーザー情報から好みのページを造る(会員ページとか)

PHPは「フリー」です。

無料のフリー

PHPは、タダで手に入ります。
ライセンス料、サポート料、アップグレード料もダタです。
※. 個人使用でない場合や別途ツールなんかを使う場合は調べてくださいね。

自由のフリー

PHPオープンソースなので中身をだれでも参照できます。
ソースは見たくないけど機能の使い方は知りたいっていう時でも世の中の誰かが調べた情報がインターネットにたくさん散らばっています。
自由に使っていいんです!(ある程度のルールは守ってくださいね)

造るのに好きなものを自由に選んでいいんです!
OSはWindowsMac OSLinux、Slaris、Unixで使えます。特別な専用サーバを用意しなくても造れるんです!
Webサーバプログラムだって特別なものを用意しなくていいんです!
CGI規格をサポートしていれば、Apach、Microsift Internet InfomationServer ( IIS ) でもいいのです。
データベースもいろいろ選べます。
MySQLOracleMicrosoft SQL ServerSybasePostgreSQLといろいろあります。
ODBC規格のデータベースもサポート済みです。

PHPは情報がたくさんあります。

PHPは近年、たくさんのサイトで使われています。
個人のサイトから大きなサイトまでたくさん!
だから、書籍や雑誌、Webサイトなどでたくさんの情報を参考にできます。
ちょっと使うにも、お仕事で使うにも分からないことがあっても安心タイプです。

LDAP:なんとなくわかった気がしている言葉をはっきりと

LDAPとは、ディレクトリサービスを提供するサーバへアクセスするときに使うプロトコルです。

正式名称 : Lightweight Directory Access Protocol
TCPポート番号の「389」(ウェルノウンポート)を使ってサーバへ接続します

www.atmarkit.co.jp

thinkit.co.jp

X.500という規格の1つであるDAPというプロトコルを軽量化(Lightweight)したものです。

DAPはとても重かったので軽くしたそうです。
例えば、オープンソースLDAPであるOpenLDAPWindowsでよく使われるActive DirectoryなどにLDAPは実装されています。

ディレクトリサービスとは、ネットワークの情報を一元管理し情報提供などを行うサービスです。

ネットワーク内のユーザ情報や機器情報を管理して、参照・更新などを行うサービスです。
ユーザ名から部署や電話番号を検索したり、プリンターの情報を参照できたりします。

例えば、名前解決してくれるDNSオープンソースLDAPであるOpenLDAPWindowsでよく使われるActive Directoryなどがディレクトリサービスです。

https://www.kagoya.jp/howto/wp-content/uploads/kagoya1804-kgr1_50_dns02-.jpg
【図解】DNSサーバーとは?設定・変更と確認方法 | カゴヤのサーバー研究室

http://image.gihyo.co.jp/assets/images/admin/serial/01/ad-linux2017/0001/001r.jpg
第1回 認証統合の概要[Active Directory編]:Active DirectoryとLinuxの認証を統合しよう【2017年版】|gihyo.jp … 技術評論社

階層型にデータを管理するデータベースを使います。

リレーショナルデータベースとは違うのです。
ディレクトリサービスと設定によってはリレーショナルデータベースも使えます。
ディレクトリサービスのように更新より参照が多く組織などから情報を見つけていく場合は階層型のデータベースのが向いています。

http://software.fujitsu.com/jp/manual/manualfiles/M050000/B1WN4901/02/irepsrc/dit.gif
1.2.2 LDAPとは

https://www.turbolinux.co.jp/products/server/11s/user_guide/ldaptree02.jpg
Turbolinux 11 Server: ユーザーガイド

https://techinfoofmicrosofttech.osscons.jp/index.php?plugin=ref&page=LDAP%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%A7%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%83%BB%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E6%A4%9C%E7%B4%A2%E5%87%A6%E7%90%86&src=2_DIT%28DirectoryInformationTree%29.png
FrontPage - マイクロソフト系技術情報 Wiki

f:id:ponsuke_tarou:20181205000802j:plain

Pythonのインターネットにアクセスできる外部モジュール「Requests」をインストールする

  • 環境

MacにPythone3をインストールしたので、ライブラリをインストールします。
ponsuke-tarou.hatenablog.com

インターネットにアクセスするライブラリは標準で「urllib」がありますが、「Requests」のほうが簡単らしいです。

はじめてのPythonなので簡単な方を選びます。

pipコマンドはPyPIからライブラリをインストールして設定までをしてくれるパッケージ管理システムです。

Pythone3.4以降であれば標準ではいっています。

PyPIは、Pythonでのサードパーティのライブラリを公開しています。

正式名称 : Python Package Index
読み方 : ぱいぱい
pypi.org

MacのPython3では「pip3」というコマンドになります。

$ pip3 --version
pip 9.0.3 from /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (python 3.6)

$ pip3 --help

Usage:   
  pip <command> [options]

Commands:
  install                     Install packages.
  download                    Download packages.
  uninstall                   Uninstall packages.
  freeze                      Output installed packages in requirements format.
  list                        List installed packages.
  show                        Show information about installed packages.
  check                       Verify installed packages have compatible dependencies.
  search                      Search PyPI for packages.
  wheel                       Build wheels from your requirements.
  hash                        Compute hashes of package archives.
  completion                  A helper command used for command completion.
  help                        Show help for commands.

General Options:
  -h, --help                  Show help.
  --isolated                  Run pip in an isolated mode, ignoring environment variables and user configuration.
  -v, --verbose               Give more output. Option is additive, and can be used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output. Option is additive, and can be used up to 3 times (corresponding to WARNING,
                              ERROR, and CRITICAL logging levels).
  --log <path>                Path to a verbose appending log.
  --proxy <proxy>             Specify a proxy in the form [user:passwd@]proxy.server:port.
  --retries <retries>         Maximum number of retries each connection should attempt (default 5 times).
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.
  --trusted-host <hostname>   Mark this host as trusted, even though it does not have valid or any HTTPS.
  --cert <path>               Path to alternate CA bundle.
  --client-cert <path>        Path to SSL client certificate, a single file containing the private key and the certificate in
                              PEM format.
  --cache-dir <dir>           Store the cache data in <dir>.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check
                              Don't periodically check PyPI to determine whether a new version of pip is available for
                              download. Implied with --no-index.

pip3コマンを使ってRequestsをインストールします。

# Requestsをインストール
$ pip3 install requests
Collecting requests
  Downloading https://files.pythonhosted.org/packages/ff/17/5cbb026005115301a8fb2f9b0e3e8d32313142fe8b617070e7baad20554f/requests-2.20.1-py2.py3-none-any.whl (57kB)
    100% |████████████████████████████████| 61kB 1.6MB/s 
Collecting idna<2.8,>=2.5 (from requests)
  Downloading https://files.pythonhosted.org/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746a97fab05a372e4a2c6a6b876165/idna-2.7-py2.py3-none-any.whl (58kB)
    100% |████████████████████████████████| 61kB 6.2MB/s 
Collecting urllib3<1.25,>=1.21.1 (from requests)
  Downloading https://files.pythonhosted.org/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl (118kB)
    100% |████████████████████████████████| 122kB 3.7MB/s 
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
    100% |████████████████████████████████| 143kB 4.2MB/s 
Collecting certifi>=2017.4.17 (from requests)
  Downloading https://files.pythonhosted.org/packages/56/9d/1d02dd80bc4cd955f98980f28c5ee2200e1209292d5f9e9cc8d030d18655/certifi-2018.10.15-py2.py3-none-any.whl (146kB)
    100% |████████████████████████████████| 153kB 3.0MB/s 
Installing collected packages: idna, urllib3, chardet, certifi, requests
Successfully installed certifi-2018.10.15 chardet-3.0.4 idna-2.7 requests-2.20.1 urllib3-1.24.1
You are using pip version 9.0.3, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

# インストールされたことを確認する
$ pip3 list
Package    Version   
---------- ----------
certifi    2018.10.15
chardet    3.0.4     
idna       2.7       
pip        18.1      
requests   2.20.1    
setuptools 39.0.1    
urllib3    1.24.1    

pip3コマンドのバージョンが古い場合はアップグレードします。

qiita.com

インターネットの通信を安全にするIPsec

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

IPsecに関する記述のうち,適切なものはどれか。

  1. IKEIPsecの鍵交換のためのプロトコルであり,ポート番号80が使用される。
  2. 鍵交換プロトコルとして,HMAC-SHA1が使用される。
  3. トンネルモードを使用すると,暗号化通信の区間において,エンドツーエンドの通信で用いる元のIPのヘッダを含めて暗号化できる。
  4. ホストAとホストBとの間でIPsecによる通信を行う場合,認証や暗号化アルゴリズムを両者で決めるためにESPヘッダでなくAHヘッダを使用する。

平成28年秋期問15 IPsecに関する記述|情報処理安全確保支援士.com

インターネットの通信で使われるプロトコルをIPといいます。

  • 正式:Internet Protocol = Internet(インターネット) + Protocol(手順)

https://www.infraexpert.com/studygif/ipsecz13.gif
IPsec - AH・ESP・IKE

プロトコルとは、パソコンなどの機械同士が通信するときのお約束ごとのことです。

https://www.infraexpert.com/studygif/networking12.gif
ネットワーク - プロトコルとは

インターネットの世界には危険がいっぱいです。

ponsuke-tarou.hatenablog.com

IPsecは、IPでの暗号化技術を使って安全にインターネットを使うための通信プロトコルです。

  • 正式:Security Architecture for IP または IP Security Architecture = Security(安全) + Architecture(構造) + for IP(IPのための)

IPsecは、認証とカプセル化と鍵交換のプロトコルを組み合わせています。

それぞれのプロトコルで種類はいろいろ選べます。

https://networklessons.com/wp-content/uploads/2015/08/ipsec-framework-protocols.png
IPsec (Internet Protocol Security)

https://i2.wp.com/www.bilisimonline.net/wp-content/uploads/2016/06/IPsec-framework.png?resize=620%2C330
IPSec (Internet Protocol Security) |

IPsecで「どんなプロトコルアルゴリズムを使うよ」という合意をSAといいます。

  • 正式 : Security Association = Security(安全) + Association(つながり)

共有鍵暗号方式をIPsecでは使っていて、そのアルゴリズムはいろいろ選べます。だから、SAでどんな物を使うかきっちり定義しておきます。

SAが確定するとSPIという32bitの整数が割り当てられ、IPsecで通信する時はこのSPIをいつもくっつけて暗号化のアルゴリズムやどんな鍵かの情報などがわかるようにします。
  • 正式 : Security Pointer Index = Security(安全) + Pointer(指針) + Index(索引)

http://image.itmedia.co.jp/ait/articles/0011/27/pc-phase.gif
http://image.itmedia.co.jp/ait/articles/0011/27/pc-key.gif
IT管理者のためのIPSec講座 (2/3):技術解説 - @IT

使う共通鍵を交換してSAの合意を取る鍵交換プロトコルが、IKEです。

  • 正式 : Internet Key Exchange = Internet(インターネット) + Key(鍵) + Exchange(交換する)

https://www.ipa.go.jp/security/pki/images/image081.png
PKI関連技術に関するコンテンツ

https://tech.nikkeibp.co.jp/it/article/COLUMN/20071012/284162/zu11s.jpg
https://tech.nikkeibp.co.jp/it/article/COLUMN/20071012/284162/zu12s.jpg
攻略編:全体をつかんで逆から見る,日経NETWORK流で理解しよう | 日経クロステック(xTECH)

IKEは、SAを合意するときも鍵を交換するときもISAKMP(Internet Security Association and Key Management Protocol / Internet SA と 鍵管理プロトコル)というプロトコルを使い、ISAKMPメッセージ専用のUDPの500番のポートを使います。

データはESPという入れ物に入れて暗号化して送ります。

  • 正式 : Encapsulating Security Payload = Encapsulating(カプセル化している) Security(安全な) + Payload(データ伝送されるパケットのヘッダー部を除いたデータの本体)

データが改ざんされていないことを確認できるようにMACというデータを付加します。

  • 正式 : Message Authentication Code = Message(メッセージ) + Authentication(認証) + Code(コード)
  • 日本語 : メッセージ認証コード

http://image.itmedia.co.jp/ait/articles/0011/27/pc-mac.gif
IT管理者のためのIPSec講座 (3/3):技術解説 - @IT

https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/MAC.svg/512px-MAC.svg.png
MAC(メッセージ認証コード)とは - CubicLouve

MACは送信元で鍵と任意のデータで作られたハッシュ値です。送信先で同じ鍵と任意のデータでハッシュ値を作って受信したものと比較して認証を行います。
このやり方をメッセージダイジェストといいます。

ponsuke-tarou.hatenablog.com

SPIMAC・通信のシーケンス番号をAHというパックにして通信する時パケットにくっつけます。

  • 正式 : Authentication Header = Authentication(認証) + Header(先頭部)
HA自体には暗号化機能はなく、入れ物です。

https://www.cs.odu.edu/~cs779/IPv6/security/img004.GIF
Authentication Header (AH)

http://www.cs.ru.nl/~ths/a3/html/h8/8-27s.jpg
A3 H8 Network Security

https://image.slidesharecdn.com/ipsecandvpn-160313101807/95/ipsec-and-vpn-40-638.jpg?cb=1457865892
IPSec and VPN

f:id:ponsuke_tarou:20181020222446j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

セキュリティを意識したプロトコル達

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

暗号化や認証機能を持ち,遠隔にあるコンピュータを操作する機能をもったものはどれか。

ア. IPsec イ. L2TP ウ. RADIUS エ. SSH
平成26年秋期問11 SSH|情報処理安全確保支援士.com

IPsecは、IPでの暗号化技術を使った安全なインターネット用の通信プロトコルです。

ponsuke-tarou.hatenablog.com

L2TPは、送信情報を運ぶトンネルのプロトコルです。

  • 正式 : Layer 2 Tunneling Protocol

ponsuke-tarou.hatenablog.com

https://beginners-network.com/image/vpn_l2tp_ipsec_1.gif
L2TP/IPsec - ネットワーク入門サイト

RADIUSは、ネットワーク上でクライアントとサーバの認証を行うプロトコルです。

  • 正式 : Remote Authentication Dial In User Service
  • 読み方:ラディウス、ラディアス

流れは、

  1. 不正なクライアントやサーバが使えないように、クライアントとサーバの間に共通暗号鍵を設定します。
    • この共通暗号鍵を「Shared Secret」といいます。
  2. クライアントから送られてきたユーザの情報で、サーバは認証を行います。
    • クライアントが送る情報を「Access-Requestメッセージ」といいます。
  3. サーバは、認証を行い結果をクライアントへ送信します。
サーバが送る応答 パケットの種別 意味
アクセス許可 Access-Accept 認証結果がOK
アクセス拒否 Access-Reject 認証結果がNG
アクセスチャレンジ Access-Challenge 不正アクセスを防ぐために
再度パスワードの入力などを要求

SSHは、認証技術を利用して別のコンピュータと通信するプロトコルです。

  • 英語:(Secure:安全) + (Shell:コマンド入力を受け付けて解釈するプログラム)

Telnetも別のコンピュータと通信するプロトコルですが、暗号化はしていません。

残念なことに、暗号化していないのでのぞき見し放題です。

https://img-en.fs.com/images/ckfinder/ftp_images/tutorial/telnet-protocol.jpg
https://community.fs.com/blog/which-client-software-is-better-for-telnet-and-ssh.html

そこでSSH!通信経路が暗号化されているのでインターネットなどを経由しても安全に通信できます。

http://www.tku.ac.jp/~densan/local/ssh/ssh-telnet.gif
SSHの利用方法

SSHプロトコルには、「SSH1」と「SSH2」の2種類があります。

SSH1は、RSA公開鍵暗号方式を使います。
SSH2は、DSA公開鍵暗号方式を使います。が、RSA公開鍵暗号が使えるようになり「SSH2でRSA公開鍵暗号を使う」がおすすめです。
RSAは特許の問題から使用が制限されており、特許問題を回避するためにDSAを採用したSSH2が登場したという背景があるものの特許は2000年9月で失効し、SSH2でもRSAを利用して認証できるようになりました。

SSHするには、接続先でsshdが動いている必要があります。

sshdはクライアントからの接続を受けつけて、鍵の交換・暗号化・認証・コマンド実行・データ交換をしてくれます。
種類は、OpenSSHSSH Tectia Server・Reflection for Secure IT等々・・・いろいろあります。

接続元でSSHしてくれるソフトウェアをSSHクライアントといいます。

種類には、OpenSSHPuTTY・Tera Term・Poderosa・RLogin・SSH Tectia Client・Reflection for Secure IT・WebSSH等々・・・すごくいろいろあります。

f:id:ponsuke_tarou:20181014235443j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

根性で不正ログインを頑張るブルートフォース攻撃

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

共通鍵暗号の鍵を見つけ出す,ブルートフォース攻撃に該当するものはどれか。

  1. 1組の平文と暗号文が与えられたとき,全ての鍵候補を一つずつ試して鍵を見つけ出す。
  2. 平文と暗号文と鍵の関係を代数式に表して数学的に鍵を見つけ出す。
  3. 平文の一部分の情報と暗号文の一部分の情報との間の統計的相関を手掛かりに鍵を見つけ出す。
  4. 平文を一定量変化させたときの暗号文の変化から鍵を見つけ出す。

平成25年秋期問9 ブルートフォース攻撃|情報処理安全確保支援士.com

不正アクセスや不正ログインする攻撃はよくあります。

scan.netsecurity.ne.jp

tech.nikkeibp.co.jp

www.pixiv.net

攻撃 手法
ブルートフォース攻撃 パスワードをどんどん変えて正解を探す
リバースブルートフォース攻撃 IDをどんどん変えて正解を探す
パスワードリスト攻撃 ヒントを仕入れてIDとパスワードを推測して正解を探す
パスワードスプレー攻撃 IDとパスワードをどんどん変えて正解を探す

ブルートフォース攻撃は、ありとあらゆる文字列の組み合わせを片っ端から試してパスワードや鍵を見つける攻撃です。

  • 別名:ブルートフォースアタック、総当たり攻撃
  • 英語 : (brute force:力ずくの) + (attack: 攻撃)

辞書ツールやら考えられるすべての情報を使って文字列の組み合わせを全て試していく、根性の攻撃です。
パスワードの文字数や文字種が少ないと被害にあいやすいです。

f:id:ponsuke_tarou:20181010210728p:plain
ブルートフォースアタック(総当たり攻撃)とは?そのやり方・実際にかかる時間・対策方法は?

独立行政法人情報処理推進機構セキュリティセンターが、パスワードに使用している文字の種類別に解読の所要時間をまとめたもの
https://japan.norton.com/blog/wp-content/uploads/2017/11/brute-force-attack-01.png
ブルートフォースアタックとは?実験から分かる危険性と有効な4つの対策

リバースブルートフォース攻撃は、ありとあらゆる文字列の組み合わせを片っ端から試してIDを見つける攻撃です。

  • 別名:リバースブルートフォースアタック、逆総当たり攻撃
  • 英語 : (reverse:逆の) + (brute force:力ずくの) + (attack: 攻撃)

世の中には、規定回数パスワードを間違えるとロックされるアカウントロックというものがあります。
残念なことに、IDを変えていくのでアカウントロックされにくいです。
ブルートフォース攻撃の逆で、パスワードに固定文字列を使ってIDを変えながら試していきます。

http://www.ne.senshu-u.ac.jp/~proj28-19/tobe/goku-main/image-s/blue-reverse.png
リバースブルートフォース攻撃

f:id:ponsuke_tarou:20201005214643j:plain
新潟県月岡温泉したしみの宿東栄館のお部屋-松風

パスワードリスト攻撃は、どっかで仕入れた情報をもとにIDとパスワードを推測して攻撃します。

  • 別名:リスト型攻撃、パスワードリスト型攻撃、アカウントリスト攻撃、リストベース攻撃、リストベースアタック、リストアタック

いろんなサイトで同じようなIDやパスワードを使っていると被害にあいやすいです。

https://www.trendmicro.com/content/dam/trendmicro/global/ja/security-intelligence/research-reports/threat-solution/access/figure-accountlist-20130910.png
アカウントリスト攻撃 | トレンドマイクロ

https://www.asobou.co.jp/blog/wp-content/uploads/2016/09/a51b890d351455b0845e3f4ea5214711.jpg
【情報セキュリティ】パスワードリスト攻撃の手法と対策 : ビジネスとIT活用に役立つ情報

https://www.netone.co.jp/knowledge-center/blog-column/files/knowledge_takumi_060_1.png
F5 BIG-IPとMcAfee SIEMによるパスワードリスト攻撃対策ソリューション | ネットワンシステムズ

パスワードスプレー攻撃は、ブルートフォース攻撃リバースブルートフォース攻撃をいい感じに合わせています。

  • 別名:low-and-slow攻撃

japan.zdnet.com

決まった期間に決まった回数ログインに失敗するとアカウントロックがかかります。
だから、「パスワードを固定していろんなIDを試す」をひたすら繰り返します。
アカウントロックされたら別のIDでまた試します。
ついでに、不正を検知されないようにIPアドレスを変えたり、時間をずらして実行したりします。

https://stat.ameba.jp/user_images/20180404/20/mongol-sky/00/2d/j/o0461021814164100079.jpg?caw=800
不正ログインを狙った「パスワードスプレー」攻撃への注意を呼び掛け | IoT-sky

https://cybersecurity-jp.com/wp-content/uploads/2019/03/img_30629_1.png
パスワードスプレー攻撃とは?仕組みと被害の特徴、対策方法について徹底解説

f:id:ponsuke_tarou:20181010224357j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

Webサイトでの認証技術であるベーシック認証とダイジェスト認証を知る。

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

HTTPの認証機能を利用するクライアント側の処理として,適切なものはどれか。

  1. ダイジェスト認証では,利用者IDとパスワードを":"で連結したものを,MD5を使ってエンコードしAuthorizationヘッダで指定する。
  2. ダイジェスト認証では,利用者IDとパスワードを":"で連結したものを,SHAを使ってエンコードしAuthorizationヘッダで指定する。
  3. ベーシック認証では,利用者IDとパスワードを":"で連結したものを,BASE64エンコードしAuthorizationヘッダで指定する。
  4. ベーシック認証では,利用者IDとパスワードを":"で連結したものを,エンコードせずにAuthorizationヘッダで指定する。

平成24年秋期問20 HTTPの認証機能|情報処理安全確保支援士.com

HTTPの認証機能を使用することで、Webサイトにアクセスできる権限を持っているかを確認します。

会員サイトなどのWebサイトを特定の人々だけ見れるようにするには認証機能を使用します。
認証機能を使用することでWebページを見られる人かを確認します。

https://mdn.mozillademos.org/files/14689/HTTPAuth.png
HTTP 認証 - HTTP | MDN

ログイン画面を使うForm認証は、HTTPプロトコルの認証方式は使いません。

  • ログイン画面に情報を入力するタイプです。
  • セッションに情報を持つため、セッションがログアウトなどで切れると再認証が必要になります。

例えばEvernoteのログイン画面とか。
f:id:ponsuke_tarou:20181001223508p:plain

クライアント側で行うHTTPの認証機能にはベーシック認証やダイジェスト認証などがあります。

認証方式 パスワードとIDの送信方法
Basic認証 Base64エンコードして平文で送信
Digest認証 ランダム文字列と合わせてMD5でハッシュ化して送信
Form認証 画面に入力された値を送信

ベーシック認証は、ユーザ名とパスワードの組みをコロン ":" でつなぎ、Base64エンコードして送信します。

  • 別名:基本認証
  • 利点:多くのWebサーバが対応しています。
  • 欠点:盗聴や改竄が簡単にできます。

https://medium-company.com/wp-content/uploads/2019/03/auth01.png
Basic認証 Digest認証 Form認証の違い - ITを分かりやすく解説

認証の流れは、

http://www.bnote.net/linux/img/basic_auth.png
ベーシック認証 - bnote

1. クライアントがページをリクエストする
2. WebサーバがWWW-AuthenticateヘッダでHTTPステータスコード401を返す
  • HTTPステータスコード:Webサーバがレスポンスの意味を表す3桁のコードです。
    • 別名:レスポンスコード
    • 401(Unauthorized):「認証が必要だよん」とWebサーバは言っている。

WWW-Authenticate ヘッダーは 401 Unauthorized 応答と共に送られます。

WWW-Authenticate: Basic realm="Access to the staging site", charset="UTF-8"
WWW-Authenticate - HTTP | MDN

https://docs.microsoft.com/ja-jp/aspnet/web-api/overview/security/basic-authentication/_static/image1.png
ASP.NET Web API の基本認証 | Microsoft Docs

3. クライアントがBase64エンコードしたユーザ名とパスワードをAuthorizationヘッダに指定して送る


Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
Authorization - HTTP | MDN

4. Webサーバが認証する

Base64エンコードは、文字列を64進数で表すことです。

64進数は、「A-Z」「a-z」「0-9」「+/」を使って余ったところは「=」で埋める方式です。

MIMEなんかでも使っています。

# Base64エンコードしてみます。
$ echo -n 'ponsuke:tarou' | base64
cG9uc3VrZTp0YXJvdQ==
# 残念なことに簡単にデコードできます。
$ echo 'cG9uc3VrZTp0YXJvdQ==' | base64 -D
ponsuke:tarou

qiita.com

ダイジェスト認証は、パスワードをハッシュ値にして送信します。

  • 英語:digest authentication
  • 別名:HTTPダイジェスト認証
  • 利点:ベーシック認証で防げなかった漏洩やら改ざんができます。
  • 欠点:対応していないブラウザがあります。

https://medium-company.com/wp-content/uploads/2019/03/auth02.png
Basic認証 Digest認証 Form認証の違い - ITを分かりやすく解説

認証の流れは、

https://tech.nikkeibp.co.jp/it/article/COLUMN/20080513/301605/zu02.jpg
第6回 ユーザー認証 | 日経クロステック(xTECH)

https://www.ipa.go.jp/security/awareness/vendor/programmingv1/images/b09_01_6.png
9-1. パスワードの取り扱い

1. クライアントがページをリクエストする
2. WebサーバがWWW-AuthenticateヘッダでHTTPステータスコード401だけではなく「認証領域」や「認証方式」、「ランダムな文字列」を返す
  • ここの
    • 認証領域は、realm
    • 認証方式は、Digest(ダイジェスト認証だよと知らせる)
    • ランダムな文字列は、
      • nonce(認証要求ごとに生成される一時的なデータでチャレンジともいう)
      • opaque(ランダムに生成されるデータ)
  • といいます。

http://image.itmedia.co.jp/ait/articles/0411/17/r20_100_1.gif
Tomcatでダイジェスト認証を使う:JavaTips 〜アプリケーションサーバ/コンテナ活用編 - @IT

3. クライアントがランダムな文字列を生成して、ユーザ名・パスワードと「2つのランダムな文字列」を使ってハッシュ文字列を生成する
  • ここの
    • 生成したランダムな文字列は、cnonce
    • ハッシュ文字列は、response
  • といいます。
  • ハッシュ値を生成する関数を「ハッシュ関数」「要約関数」「メッセージダイジェスト」といいます。
4. クライアントは「2つのランダムな文字列」と「ハッシュ文字列」を送信する

http://image.itmedia.co.jp/ait/articles/0411/17/r20_100_2.gif
Tomcatでダイジェスト認証を使う:JavaTips 〜アプリケーションサーバ/コンテナ活用編 - @IT

5. Webサーバは「2つのランダムな文字列」とサーバに格納されているパスワードからハッシュ文字列を生成して認証する

ハッシュ値からパスワードを復元するのはめちゃめちゃ大変なので、サーバのパスワードもハッシュ値にしてクライアントから送られてきたハッシュ値と比較します。

MD5は、文字列から128ビットの値のハッシュ値を生成するハッシュ関数です。

  • 正式:Message Digest 5
  • 規約:RFC 1321
  • 特徴:
    1. 同じ入力値は必ず同じ値になる
    2. 少しでも異なる入力値は全然違う値になる
    3. 不可逆な一方向関数を含むのでハッシュ値から効率よく入力値を割り出すことはできない
  • 欠点:入力値がハッシュ値より長い場合、複数の異なる入力値なのに同じハッシュ値になってしまう「ハッシュ値の衝突」が起こる
# MD5でハッシュ値を生成する
$ echo 'tarou' | md5
961ed3c18a02b9b87bcd3efa9eb2a0a9
# ちょっと違う文字だとぜんぜん違うハッシュ値が生成される
$ echo 'taroo' | md5[f:id:ponsuke_tarou:20181005164602j:plain]
e11337e5c8ce85a437712f57c63249e8
$ echo 'tarou' | md5
26223ea272f3f0e42cf872c01b9ba8ec
  • 前回勉強したメールの認証:CRAM-MD5でも使っています。

ponsuke-tarou.hatenablog.com

次回の勉強内容

ponsuke-tarou.hatenablog.com

DDL と DLL の違い

DDLDLLは全く違うものです。

わかっちゃいるけど、どっちがどっちか頻繁に忘れるので記録します。

共通点はどちらも拡張子になることぐらいです。

DDLとは、テーブル構造を定義する言語です。

  • 正式名称:Data Definition Language
  • 別名:データ定義言語
  • リレーショナルデータベースのテーブルを制御する言語。

www.weblio.jp

「CREATE」「DROP」「ALTER」などが書いてあるやつです。

  • テーブル全体の作成・変更・削除などを行う際に使用する。

仲間には、レコード単位の操作を行うDMLがあります。

  • 正式名称:Data Manipulation Language
  • 別名:データ操作言語
  • リレーショナルデータベースのレコードを制御する言語。
  • テーブル内のレコードの追加・検索・更新・削除などを行う際に使用する。
「SELECT」「INSERT」「UPDATE文」「DELETE」などが書いてあるやつです。
  • データベースにおいてデータの検索・新規登録・更新・削除を行うための言語である。

www.weblio.jp

DLLとは、プログラムを動かす時に使う部品です。

  • 正式名称:Dynamic Link Library
  • 別名:共有ライブラリ、シェアドライブラリ、動的リンクライブラリ
  • 様々なプログラムから利用される汎用性の高い機能を収録した、部品化されたプログラムのこと。
  • 単体で実行することはできず、実行可能ファイル(EXEファイルなど)が起動する際に自動的に連結されてメモリ上に展開される。
  • 多くのプログラムが共通して必要とする機能が収められており、様々なプログラムの一部として取り込まれて実行される。

www.weblio.jp

f:id:ponsuke_tarou:20180918221636j:plain

メール送信での認証技術に POP before SMTP と SMTP-AUTH

前回の勉強内容

ponsuke-tarou.hatenablog.com

むかしむかし、SMTPには認証の仕組みがありませんでした。

それに伴い、大量のメールを送り付ける「迷惑メール」が流行りました。
そこでメール送信時の認証技術として、「POP before SMTP」「SMTP-AUTH」ができました。

電子メールを送信・転送するプロトコルであるSMTPには、

  1. 送信処理と転送処理を同一の仕組みで扱っている
  2. メールの投稿をするユーザを認証する仕組みがない
  3. 暗号化機能が標準で実装されていないため通信経路上を平文のメッセージが流れる

などの脆弱性があり、特に1,2の原因によって複数のメールサーバの第三者中継を利用した迷惑メールの温床となっていました。
平成18年秋期問74 SMTP-AUTH認証はどれか|応用情報技術者試験.com

POP before SMTPは、メールを送信する前にPOP3認証を行って認証できたらメールを送信する仕組みです。

SMTPに認証の仕組みはないけれど、メール受信で使うPOP3にはIDとパスワードによる認証の仕組みがあります。

https://asahi-net.jp/support/guide/mail/img/0598-1.gif
POP before SMTP方式|プロバイダ ASAHIネット

http://www.tku.ac.jp/~densan/local/mail/popbeforesmtp.gif
メールの利用:メールソフト編

利用者が別のPOP3認証された後、一定時間に限ってメールの送信を許可する仕組みです。

POP3認証をしてから数分間は、認証なしで送信し放題なのでスパムメールが送信できるかもしれません。
複数のPCで同じIPアドレスを使用するNAT環境下では認証を通った人と違う人がメールを送信できちゃいます。

SMTP-AUTHが実装されていない旧バージョンのメールサーバソフトにおいて、メール送信の際のユーザ認証を実現するために使用されていました。
平成26年秋期問21 POP before SMTP|ネットワークスペシャリスト.com

SMTP-AUTHは、メールサーバがメール送信者をIDとパスワードで認証してからメールを送信する仕組みです。

  • 別名:SMTP Authentication(認証)
  • 規定:RFC 2554

SMTP-AUTHの特徴はどれか。

  1. ISP管理下の動的IPアドレスからの電子メール送信について,管理外ネットワークのメールサーバへSMTP接続を禁止する。
  2. PCからメールサーバへの電子メール送信時に,ユーザアカウントとパスワードによる利用者認証を行う。
  3. PCからメールサーバへの電子メール送信は,POP接続で利用者認証済の場合にだけ許可する。
  4. 電子メール送信元のサーバが,送信元ドメインDNSに登録されていることを確認して,電子メールを受信する。

平成27年春期問16 SMTP-AUTHの特徴はどれか|情報処理安全確保支援士.com

https://www.tiki.ne.jp/security/img/spam_fig2.gif
SMTP認証について セキュリティ - TikiTikiインターネット

https://www.cuenote.jp/img/sr-s/feature/smtp_auth-image.gif
パスワード認証(SMTP AUTH)対応|メール配信エンジン・メールリレーサーバー Cuenote SR-S

クライアントがSMTPサーバにアクセスするときにユーザ認証を行い、許可されたユーザだけから電子メールを受け付けます。

SMTP-AUTHにおける認証の動作を説明したものはどれか。

ア. SMTPサーバは,クライアントがアクセスしてきた場合に利用者認証を行い,認証が成功したとき電子メールを受け付ける。
平成26年秋期問37 SMTP-AUTHにおける認証の動作|応用情報技術者試験.com

SMTP-AUTHの特徴はどれか。

ウ. メールクライアントからメールサーバへの電子メール送信時に,ユーザアカウントとパスワードによる利用者認証を行う。
平成28年秋期問16 SMTP-AUTHの特徴はどれか|情報処理安全確保支援士.com

認証方法には種類があります。

f:id:ponsuke_tarou:20180913234047j:plain

認証方法 方法 説明
PLAIN 暗号化しないでユーザー名/パスワードをそのまま送る仕組み パスワードが平文で流れているので危険な方式
LOGIN 標準化されておらず独自の実装をしているメールサーバーもあって互換性が低い方式 ユーザー名/パスワードはBASE64に変換される
ユーザー名/パスワードを別々に送信したり一緒に送信したりする(やり方はそれぞれ)
CRAM-MD5 パスワード文字列がそのままネットワークを流れることがないように、暗号化が施される
MD5を使用してチャレンジ-レスポンス認証を行い、パスワードそのものは暗号化された状態でも送信はしない
流れ
1. サーバーとクライアントが共通に知っているパスワードを用意
2. サーバーは、クライアントに対し任意の文字列(Challenge文字列)を送る
3. クライアントはそのChallenge文字列と共通パスワードを使い、MD5で計算処理を行う
4. 結果をサーバーに返す
5. クライアントからの返答が傍受されても、ここからパスワードを復元するのは困難
6. サーバーは、自分でも同じ処理を行ない、結果が一致すれば相手が正しくパスワードを知っているとして認証する
DIGEST-MD5 CRAM-MD5の拡張版で、辞書攻撃や総当り攻撃などに対する耐性を高めたもの

サブミッションポートを合わせて使います。

e-words.jp

スパムメール対策として,サブミッションポート(ポート番号587)を導入する目的はどれか。

エ. SMTP-AUTHを使用して,メール送信者を認証する。
平成28年春期問44 サブミッションポートの導入目的|応用情報技術者試験.com

OP25Bでポート25番を使えないようにして、送信専用ポートとしてサブミッションポート587番を使います。
送信専用となったポート587番にアクセスしたユーザをSMTP-AUTHで認証します。
ponsuke-tarou.hatenablog.com

f:id:ponsuke_tarou:20180913233607j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

スパムメール撲滅を目指す送信ドメイン認証技術

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

スパムメールへの対策であるDKIM(DomainKeys Identified Mail)の説明はどれか。

  1. 送信側メールサーバにおいてディジタル署名を電子メールのヘッダに付与し,受信側メールサーバにおいてそのディジタル署名を公開鍵によって検証する仕組み << 正解
  2. 送信側メールサーバにおいて利用者が認証された場合,電子メールの送信が許可される仕組み
  3. 電子メールのヘッダや配送経路の情報から得られる送信元情報を用いて,メール送信元のIPアドレスを検証する仕組み
  4. ネットワーク機器において,内部ネットワークから外部のメールサーバのTCPポート番号25への直接の通信を禁止する仕組み

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

メールアドレスのドメインを検証することでなりすましや改ざんを検知できるようにする技術を送信ドメイン認証技術といいます。

残念なことにメールは送信元を偽ることができちゃいます。
スパムメールは送信元を偽装していることが多く、メールのヘッダに書いてある「From」のメールアドレスは安易に信用できません。
そこで、ちゃんとした送信元かを確認できるようにするための送信ドメイン認証技術が造られました。

送信ドメイン認証技術には、IPアドレスを利用するタイプと電子署名を利用するタイプがあります。

送信ドメイン認証技術 利用するもの
SFP IPアドレス
Sender ID IPアドレス
DKIM 電子署名

IPアドレスを利用するタイプは、あらかじめDNSサーバにIPアドレスを公開しておいて、受信側がDNSIPアドレスを検証します。

f:id:ponsuke_tarou:20211005190659j:plain

認証方法によって、送信メールサーバのIPアドレスの取得元が異なります。

送信ドメイン認証 IPアドレスの取得元
SFP エンベロープFromにあるメールアドレス
Sender ID メールヘッダのFromやSenderにあるメールアドレス

SFPは、メールの「エンベロープFromにあるメールアドレス」から取得します。

  • 英語:Sender Policy Framework

https://www.ipa.go.jp/files/000015419.png
https://www.ipa.go.jp/files/000015420.png
なりすましメール撲滅に向けたSPF(Sender Policy Framework)導入の手引き:IPA 独立行政法人 情報処理推進機構

SPF(Sender Policy Framework)の仕組みはどれか。

イ. 電子メールを受信するサーバが,電子メールの送信元のドメイン情報と,電子メールを送信したサーバのIPアドレスから,ドメインの詐称がないことを確認する。
https://www.fe-siken.com/kakomon/30_haru/img/40.gif
平成30年春期問40 SPFの仕組みはどれか|基本情報技術者試験.com

エンベロープFrom(英語 : envelope(封筒) from)」とは、配信処理用のメールアドレスのことです。
エンベロープFromは、実際の送信者メールアドレスであり、宛先にメールが届くとエンベロープFromは削除されます。
メールヘッダにあるFromは、設定で変更することができます。
迷惑メールなどはメールヘッダにあるFromを詐称していたりします。

https://www.cuenote.jp/documents/img/envelope-image02.gif
3 エンベロープ(envelope)From/To とヘッダーのFrom/To|Cuenote

エンベロープFrom」は、メールが宛先に到着してSMTPが終わると消えます。
でもなくなると問題があったときの送信先に困っちゃうので、メールの「Return-Path」に出力されます。
なので、Return-Pathを確認することでエンベロープFromが確認できます。
例えば、三井住友銀行からもらったお知らせメールの場合はこんな感じ。

...ここでエンベロープFromが確認できます。...
Return-Path: <51212-585086@envelope-from.smbc.co.jp>
...
From: "三井住友銀行" <smbc_info@ra.smbc.co.jp>
To: ponsukeのメアド
Subject: <重要>【三井住友銀行】 三井住友銀行アプリ「プッシュ通知」の一部サービス終了のお知らせ
....

なので、「エンベロープFromにあるメールアドレス」のドメインから送信側メールサーバのIPアドレス取得して検証します。

https://sendgrid.kke.co.jp/blog/wp/wp-content/uploads/2018/08/01_mail_example.png
SPF, DKIMの特徴と違い | SendGridブログ

Sender IDは、「メールヘッダのFromやSenderにあるメールアドレスからします。

メールヘッダのFromやSender」はメーラなどの表示用のメールアドレスです。
メールヘッダのFromやSenderは、配信処理には使用されず送信者以外のアドレスを使用することが可能です。
メールヘッダのFromやSenderにあるメールアドレスのことをPRA(Purported(~といわれている) Responsible Address)ともいいます。
Sender IDは、PRAのドメインと同じサーバから送信されているかどうかを検証します。
PRAでは、Resent-Sender / Resent-From / Received / Senderなどのから情報を取得します。
取得方法の詳細は、rfc4407の2. Determining the Purported Responsible Addressに記載されています。

f:id:ponsuke_tarou:20200915235847j:plain
西巣鴨にある朝倉のチーズケーキは絶品

電子署名を利用するタイプは、あらかじめDNSサーバに公開鍵を公開しておいて、受信側がメールヘッダの電子署名DNSで公開鍵を取得して検証します。

  • 流れ
    1. 送信側がDNSサーバに公開鍵を公開する
    2. 送信側が秘密鍵電子署名をつくってメールヘッダにくっつける
    3. 受信側がメールヘッダにあるメールアドレスのドメインからDNSサーバで公開鍵を取得する
    4. その公開鍵で検証する

DKIMは、送信側メールサーバで電子署名を電子メールのヘッダに付与して、受信側メールサーバで検証します。

  • 読み方:ディーキム

電子署名を利用するタイプにIIM(Identified Internet Mail)とDomainKeysという認証方法がありました。
この認証方法が合体してDKIMができました。
正式名称は、DomainKeys Identified(認証する) Mailです。

送信側のメールサーバで、メールヘッダとボディから電子署名を作成して、DKIM-Signatureヘッダに追加します。
例えば、三井住友銀行からもらったお知らせメールの場合はこんな感じ。

......
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ra.smbc.co.jp; s=smbcrmpc; t=1...; bh=Et...; h=From:To:Subject:Reply-To:Message-Id:Date:MIME-Version:
	 Content-Type; b=dw8...
From: "三井住友銀行" <smbc_info@ra.smbc.co.jp>
To: ponsukeのメアド
Subject: <重要>【三井住友銀行】 三井住友銀行アプリ「プッシュ通知」の一部サービス終了のお知らせ
....

スパムメールの対策であるDKIM(DomainKeys Identified Mail)の説明はどれか。

ア. 送信側メールサーバでディジタル署名を電子メールのヘッダに付与して,受信側メールサーバで検証する。
平成30年春期問12 DKIMの説明はどれか|情報処理安全確保支援士.com

http://image.itmedia.co.jp/ait/articles/0602/16/r20_01.gif
電子署名方式の最新技術「DKIM」とは:送信ドメイン認証技術解説(1/4 ページ) - @IT

DMARCは、送信ドメイン認証での「認証結果によるメール配信制御」「認証結果のレポート」を行うシステムです。

英語ではDomain-based Message Authentication, Reporting and Conformance(~との一致)、読み方は「ディーマーク」です。

https://mailmarketinglab.jp/word-dir/wordpress/wp-content/uploads/2017/04/20170331_04-768x729.jpg
DMARCとは?送信ドメイン認証の仕組みを理解して、なりすまし対策をしよう! | メルラボ

https://cloud.watch.impress.co.jp/img/clw/docs/1066/519/dmarc_s.jpg
TwoFive、なりすまし対策に有効なDMARCレポートを集計・可視化するサービス「DMARC / 25 Analyze」を提供開始 - クラウド Watch

「検証結果でそのメールをどう扱って欲しいか」を記述した情報の定義をSSP(Sender Signing Practice)といいます。
SSPは、DNSサーバに置いておきます。

f:id:ponsuke_tarou:20180913225716j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

PKIは、世の中の安全を守っています。

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

PKIを構成するOCSPを利用する目的はどれか。

  1. 誤って破棄してしまった秘密鍵の再発行処理の進捗状況を問い合わせる。
  2. ディジタル証明書から生成した鍵情報の交換がOCSPクライアントとレスポンダの間で失敗した際,認証状態を確認する。
  3. ディジタル証明書の失効情報を問い合わせる。
  4. 有効期限の切れたディジタル証明書の更新処理の進捗状況を確認する。

平成31年春期問2 OCSPを利用する目的はどれか|情報処理安全確保支援士.com

OCSPは、デジタル証明書をCRLを突き合わせて有効かを確認するためのプロトコルです。

ponsuke-tarou.hatenablog.com

PKIは、暗号化技術と電子署名で世の中の安全を守る仕組みです。

PKIとは、公開鍵暗号を正しく発行し配布するシステム。証明局発行の鍵が含まれた証明書をリボジトリで集中管理・配布する。
PKIとは - 意味の解説|ITトレンドのIT用語集

公開鍵暗号技術と電子署名を使って、インターネット上で安全な通信ができるようにするための環境のことを言います。 なりすましやデータの盗聴や改竄を防ぐためのインフラとして近年注目が高まっています。
インターネット用語1分解説~PKIとは~ - JPNIC

データの暗号化とデジタル署名によってPKIは「守秘性」、「完全性」、「認証」、「否認防止」といったセキュリティサービスを提供します。 これらのセキュリティサービスによって、自分が知らぬ間に情報を書き換えられるような事態や、機密情報が盗聴されるといった脅威を防ぐことできます。 そしてPKIとビジネスで利用される様々なアプリケーションを組みあわせることにより、そのアプリケーションに対してセキュリティインフラを提供することができます。
PKIとは

暗号化技術はいろいろあります。

ponsuke-tarou.hatenablog.com

電子署名で、送信者が送ったデータの完全性を保証します。

ponsuke-tarou.hatenablog.com

送信者の公開鍵で電子署名を復号しますが、公開鍵が本当に送信者のものかわかりません。

https://www.ipa.go.jp/security/pki/images/image020.png
IPA PKI 概要 3.1.1 公開鍵配布時の認証

公開鍵の持ち主を確認するには2つの方法があります。

PGPモデルは、公開鍵の持ち主と公開鍵の受領者の両方に信頼された第3者が証明書を公開鍵にくっつけて受領者へ渡す方法です。

個人レベルの信頼関係が必要となり、全体が管理されないため用途は少ないです。

認証局モデルは、第3者機関に公開鍵の持ち主を保証してもらい第3者機関の発行した証明書で公開鍵の正当性を確認します。

この第3者機関を「Trusted Third Party(TTP)」「認証局:Certification Authority(CA)」といいます。

https://www.ipa.go.jp/security/pki/images/image021.png
https://www.ipa.go.jp/security/pki/images/image022.png
IPA PKI 概要 (2) 認証局モデル

https://jp.globalsign.com/images/knowledge/ill_ca01.gif
認証局 (CA:Certification Authority)とは?|GMOグローバルサイン【公式】

ponsuke-tarou.hatenablog.com

認証局モデルでは信用関係の保証が重要です。

  1. 受領したデータが改ざんされていないことを確認するには電子署名を確認します。
  2. 電子署名を複合するには送信者の公開鍵が必要です。
  3. 公開鍵を使うには公開鍵が本物か証明書を確認します。
  4. その証明書が信用できるか確認するには認証局が信頼できるかを確認する必要があります。

https://www.ipa.go.jp/security/pki/images/image050.png
https://www.ipa.go.jp/security/pki/images/image051.png
PIA 5 信用モデル

認証局の信用関係を作る方法には種類があります。

種類 説明
単独 CA モデル 1つの CA が全てのユーザに証明書を発行する方式です。
階層型モデル 複数の CA を階層型(ツリー構造)に構成する方式です。
Web モデル あらかじめクライアントのアプリケーションにルート CA の一覧を埋め込む方式です。Web ブラウザで用いられています。
メッシュモデル 複数の CA を相互認証により接続する方式です。
ブリッジ CA モデル 複数の CA がブリッジ CA を介して接続する方式です。

https://www.ipa.go.jp/security/pki/images/image049.png
PIA 5 信用モデル

f:id:ponsuke_tarou:20180904211807j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

さるがSQL*Plusって何?って思ったのでインストールしてみた。

SQL*Plusは、OracleのDB用のCUIクライアントツールです。

SQL*Plusは、Oracle Databaseのインストール時にインストールされる対話型のバッチ問合せツールです。SQL*Plusでは、コマンドライン・ユーザー・インタフェースを使用できます。

また、SQL*Plus Instant Clientもあります。これは、OCI Instant Client対応のプラットフォームで使用できるスタンドアロンコマンドライン・インタフェースです。SQL*Plus Instant Clientは使用可能なすべてのOracle Databaseに接続されますが、専用のOracle Databaseをインストールする必要はありません。
SQL*Plusのクイック・スタート

SQL*Plus とは SQL を実行するためのインターフェイスユーティリティである。
インスタンスの起動とマニュアル操作によるインタラクティブSQL の実行が主であるが shell などのスクリプト言語と サイレントモード を併用することで簡単なバッチ処理にも使用できる(※)。
www.shift-the-oracle.com

sqlplusはoracleに対して処理を指示するための最も基本的なCUISQLクライアントツールです。 実質oracle databaseがインストールされている環境にはほぼすべてsqlplusもインストールされているため以下のような様々な用途で使用されています。
WalkingAlone sqlplusとは

e-words.jp

何となく分かるようなわからないのでインストールします。

インストールしてみた。

  • インストールする環境:Windows10 Pro 64bit
1. Oracle Technology Network(OTN)からパッケージをダウンロードします。
2. ダウンロードしたものをすべて解凍して1つのフォルダにまとめます。
  • 解凍したファイルの中身の一部
    • sqlplus.exe : SQL*Plus実行可能ファイル
    • orasqlplusicXX.dll : SQL*Plusデータ共有ライブラリ
    • oci.dll : クライアント・コード・ライブラリ
    • oraociicusXX.dll : OCI Instant Clientデータ共有ライブラリ(英語のみ)
    • orannzsbbXX.dll : セキュリティ・ライブラリ
3. 解凍したフォルダを `C:\app\oracle\instantclient_xx_x` に配置します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
$ find /c/app/oracle/ -type d
/c/app/oracle/
/c/app/oracle/instantclient_18_3
/c/app/oracle/instantclient_18_3/help
/c/app/oracle/instantclient_18_3/help/ja
/c/app/oracle/instantclient_18_3/help/ja/img
/c/app/oracle/instantclient_18_3/help/ja/img_text
/c/app/oracle/instantclient_18_3/help/us
/c/app/oracle/instantclient_18_3/help/us/img
/c/app/oracle/instantclient_18_3/help/us/img_text
/c/app/oracle/instantclient_18_3/sdk
/c/app/oracle/instantclient_18_3/sdk/admin
/c/app/oracle/instantclient_18_3/sdk/demo
/c/app/oracle/instantclient_18_3/sdk/include
/c/app/oracle/instantclient_18_3/sdk/lib
/c/app/oracle/instantclient_18_3/sdk/lib/bc
/c/app/oracle/instantclient_18_3/sdk/lib/msvc
/c/app/oracle/instantclient_18_3/sdk/lib/msvc/vc14
/c/app/oracle/instantclient_18_3/vc14
4. Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
$ printenv | grep -i oracle
SQL_PLUS=C:\app\oracle\instantclient_18_3 # 何のパスかすぐわからなくなるので環境変数を1つ作ってそれをPATHに設定しました。
PATH=<省略>/c/app/oracle/instantclient_18_3:/c/ProgramData/Oracle/Java/javapath:<省略>
ORIGINAL_PATH=<省略>/c/app/oracle/instantclient_18_3:/c/ProgramData/Oracle/Java/javapath:<省略>

f:id:ponsuke_tarou:20180905001008p:plain

5. ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。

SQL*Plusの環境変数

# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
TNS_ADMIN=C:\app\oracle\instantclient_18_3
NLS_LANG=Japanese_Japan.AL32UTF8
6. ORACLE ODBCドライバをインストールします。

管理者権限でプロンプトやGitBashなどを起動します。

# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
$ cd $SQL_PLUS # 作った環境変数です。
$ odbc_install JA
Oracle ODBC Driver is installed successfully.

qiita.com

7. SQL*Plusを起動してみます。
$ sqlplus

SQL*Plus: Release 18.0.0.0.0 - Production on 水 95 00:50:15 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

ユーザー名を入力してください:

バージョン違いの実行記録

Windows10 + Oracle Database 12c (12.2.0.1.0)のInstant Client 64bit

  1. Oracle Technology Network(OTN)からパッケージをダウンロードします。
    • instantclient-basic-windows.x64-12.2.0.1.0.zip
    • instantclient-sqlplus-windows.x64-12.2.0.1.0.zip
    • instantclient-sdk-windows.x64-12.2.0.1.0.zip
    • instantclient-jdbc-windows.x64-12.2.0.1.0.zip
    • instantclient-odbc-windows.x64-12.2.0.1.0-2.zip
# ダウンロードしたものをすべて解凍して1つのフォルダにまとめて配置します。
$ cd /c/apps/oracle

$ unzip ~/Downloads/instantclient-basic-windows.x64-12.2.0.1.0.zip
Archive:  /c/Users/ponsuke/Downloads/instantclient-basic-windows.x64-12.2.0.1.0.zip
   creating: instantclient_12_2/
  inflating: instantclient_12_2/uidrvci.sym
  inflating: instantclient_12_2/oci.sym
  inflating: instantclient_12_2/oraocci12d.sym
  inflating: instantclient_12_2/oraons.dll
  inflating: instantclient_12_2/genezi.sym
  inflating: instantclient_12_2/ociw32.dll
  inflating: instantclient_12_2/oraocci12d.dll
  inflating: instantclient_12_2/oci.dll
  inflating: instantclient_12_2/ociw32.sym
  inflating: instantclient_12_2/adrci.exe
  inflating: instantclient_12_2/oramysql12.sym
  inflating: instantclient_12_2/adrci.sym
  inflating: instantclient_12_2/xstreams.jar
  inflating: instantclient_12_2/oraociei12.dll
  inflating: instantclient_12_2/ocijdbc12.dll
  inflating: instantclient_12_2/orasql12.sym
  inflating: instantclient_12_2/oraocci12.sym
  inflating: instantclient_12_2/orannzsbb12.dll
  inflating: instantclient_12_2/ocijdbc12.sym
  inflating: instantclient_12_2/oraociei12.sym
  inflating: instantclient_12_2/genezi.exe
  inflating: instantclient_12_2/ojdbc8.jar
  inflating: instantclient_12_2/orannzsbb12.sym
  inflating: instantclient_12_2/uidrvci.exe
  inflating: instantclient_12_2/oraocci12.dll
   creating: instantclient_12_2/vc14/
  inflating: instantclient_12_2/vc14/oraocci12d.sym
  inflating: instantclient_12_2/vc14/oraocci12d.dll
  inflating: instantclient_12_2/vc14/oraocci12.dll
  inflating: instantclient_12_2/vc14/oraocci12.sym
  inflating: instantclient_12_2/orasql12.dll
  inflating: instantclient_12_2/oramysql12.dll
  inflating: instantclient_12_2/BASIC_README

$ unzip ~/Downloads/instantclient-sqlplus-windows.x64-12.2.0.1.0.zip
Archive:  /c/Users/ponsuke/Downloads/instantclient-sqlplus-windows.x64-12.2.0.1.0.zip
   creating: instantclient_12_2/
  inflating: instantclient_12_2/sqlplus.exe
  inflating: instantclient_12_2/SQLPLUS_README
  inflating: instantclient_12_2/glogin.sql
  inflating: instantclient_12_2/orasqlplusic12.dll
  inflating: instantclient_12_2/sqlplus.sym

$ unzip ~/Downloads/instantclient-sdk-windows.x64-12.2.0.1.0.zip
Archive:  /c/Users/ponsuke/Downloads/instantclient-sdk-windows.x64-12.2.0.1.0.zip
   creating: instantclient_12_2/sdk/
   creating: instantclient_12_2/sdk/include/
  inflating: instantclient_12_2/sdk/include/oci8dp.h
  inflating: instantclient_12_2/sdk/include/occiCommon.h
  inflating: instantclient_12_2/sdk/include/occiControl.h
  inflating: instantclient_12_2/sdk/include/oci1.h
  inflating: instantclient_12_2/sdk/include/ociap.h
  inflating: instantclient_12_2/sdk/include/orl.h
  inflating: instantclient_12_2/sdk/include/oratypes.h
  inflating: instantclient_12_2/sdk/include/nzt.h
  inflating: instantclient_12_2/sdk/include/xa.h
  inflating: instantclient_12_2/sdk/include/odci.h
  inflating: instantclient_12_2/sdk/include/occi.h
  inflating: instantclient_12_2/sdk/include/ociapr.h
  inflating: instantclient_12_2/sdk/include/ldap.h
  inflating: instantclient_12_2/sdk/include/ocixstream.h
  inflating: instantclient_12_2/sdk/include/ocixmldb.h
  inflating: instantclient_12_2/sdk/include/oro.h
  inflating: instantclient_12_2/sdk/include/ocixml.h
  inflating: instantclient_12_2/sdk/include/oci.h
  inflating: instantclient_12_2/sdk/include/occiAQ.h
  inflating: instantclient_12_2/sdk/include/ocidef.h
  inflating: instantclient_12_2/sdk/include/ociextp.h
  inflating: instantclient_12_2/sdk/include/orid.h
  inflating: instantclient_12_2/sdk/include/ort.h
  inflating: instantclient_12_2/sdk/include/ocidem.h
  inflating: instantclient_12_2/sdk/include/ocikpr.h
  inflating: instantclient_12_2/sdk/include/occiObjects.h
  inflating: instantclient_12_2/sdk/include/ocidfn.h
  inflating: instantclient_12_2/sdk/include/ori.h
  inflating: instantclient_12_2/sdk/include/occiData.h
  inflating: instantclient_12_2/sdk/include/nzerror.h
   creating: instantclient_12_2/sdk/lib/
   creating: instantclient_12_2/sdk/lib/msvc/
  inflating: instantclient_12_2/sdk/lib/msvc/oci.lib
  inflating: instantclient_12_2/sdk/lib/msvc/oramysql12.lib
   creating: instantclient_12_2/sdk/lib/msvc/vc14/
  inflating: instantclient_12_2/sdk/lib/msvc/vc14/oraocci12d.lib
  inflating: instantclient_12_2/sdk/lib/msvc/vc14/oraocci12.lib
  inflating: instantclient_12_2/sdk/lib/msvc/oraocci12.lib
  inflating: instantclient_12_2/sdk/lib/msvc/oraocci12d.lib
  inflating: instantclient_12_2/sdk/lib/msvc/ociw32.lib
   creating: instantclient_12_2/sdk/lib/bc/
  inflating: instantclient_12_2/sdk/lib/bc/oci.lib
 extracting: instantclient_12_2/sdk/ottclasses.zip
  inflating: instantclient_12_2/sdk/SDK_README
  inflating: instantclient_12_2/sdk/ott.bat
   creating: instantclient_12_2/sdk/admin/
  inflating: instantclient_12_2/sdk/admin/oraaccess.xsd
   creating: instantclient_12_2/sdk/demo/
  inflating: instantclient_12_2/sdk/demo/bcmake.bat
  inflating: instantclient_12_2/sdk/demo/make.bat
  inflating: instantclient_12_2/sdk/demo/cdemo81.c
  inflating: instantclient_12_2/sdk/demo/occidemod.sql
  inflating: instantclient_12_2/sdk/demo/occiobj.typ
  inflating: instantclient_12_2/sdk/demo/occidml.cpp
  inflating: instantclient_12_2/sdk/demo/occiobj.cpp
  inflating: instantclient_12_2/sdk/demo/oraaccess.xml
  inflating: instantclient_12_2/sdk/demo/occidemo.sql

$ unzip ~/Downloads/instantclient-jdbc-windows.x64-12.2.0.1.0.zip
Archive:  /c/Users/ponsuke/Downloads/instantclient-jdbc-windows.x64-12.2.0.1.0.zip
  inflating: instantclient_12_2/JDBC_README
  inflating: instantclient_12_2/orai18n-mapping.jar
  inflating: instantclient_12_2/heteroxa12.sym
  inflating: instantclient_12_2/heteroxa12.dll
  inflating: instantclient_12_2/orai18n.jar

$ unzip ~/Downloads/instantclient-odbc-windows.x64-12.2.0.1.0-2.zip
Archive:  /c/Users/ponsuke/Downloads/instantclient-odbc-windows.x64-12.2.0.1.0-2.zip
   creating: instantclient_12_2/help/
   creating: instantclient_12_2/help/ja/
  inflating: instantclient_12_2/help/ja/blafdoc.css
  inflating: instantclient_12_2/help/ja/cpyr.htm
   creating: instantclient_12_2/help/ja/img/
  inflating: instantclient_12_2/help/ja/img/odbcdrvarch.gif
  inflating: instantclient_12_2/help/ja/img/odbcmodel.gif
  inflating: instantclient_12_2/help/ja/img/setup_app.gif
  inflating: instantclient_12_2/help/ja/img/setup_ora.gif
  inflating: instantclient_12_2/help/ja/img/setup_ssmig.gif
  inflating: instantclient_12_2/help/ja/img/setup_work.gif
   creating: instantclient_12_2/help/ja/img_text/
  inflating: instantclient_12_2/help/ja/img_text/odbcdrvarch.htm
  inflating: instantclient_12_2/help/ja/img_text/odbcmodel.htm
  inflating: instantclient_12_2/help/ja/img_text/setup_app.htm
  inflating: instantclient_12_2/help/ja/img_text/setup_ora.htm
  inflating: instantclient_12_2/help/ja/img_text/setup_ssmig.htm
  inflating: instantclient_12_2/help/ja/img_text/setup_work.htm
  inflating: instantclient_12_2/help/ja/map.xml
  inflating: instantclient_12_2/help/ja/oracle.gif
  inflating: instantclient_12_2/help/ja/sqora.htm
  inflating: instantclient_12_2/help/ja/toc.htm
   creating: instantclient_12_2/help/us/
  inflating: instantclient_12_2/help/us/blafdoc.css
  inflating: instantclient_12_2/help/us/cpyr.htm
   creating: instantclient_12_2/help/us/img/
  inflating: instantclient_12_2/help/us/img/odbcdrvarch.gif
  inflating: instantclient_12_2/help/us/img/odbcmodel.gif
  inflating: instantclient_12_2/help/us/img/setup_app.gif
  inflating: instantclient_12_2/help/us/img/setup_ora.gif
  inflating: instantclient_12_2/help/us/img/setup_ssmig.gif
  inflating: instantclient_12_2/help/us/img/setup_work.gif
   creating: instantclient_12_2/help/us/img_text/
  inflating: instantclient_12_2/help/us/img_text/odbcdrvarch.htm
  inflating: instantclient_12_2/help/us/img_text/odbcmodel.htm
  inflating: instantclient_12_2/help/us/img_text/setup_app.htm
  inflating: instantclient_12_2/help/us/img_text/setup_ora.htm
  inflating: instantclient_12_2/help/us/img_text/setup_ssmig.htm
  inflating: instantclient_12_2/help/us/img_text/setup_work.htm
  inflating: instantclient_12_2/help/us/map.xml
  inflating: instantclient_12_2/help/us/oracle.gif
  inflating: instantclient_12_2/help/us/sqora.htm
  inflating: instantclient_12_2/help/us/toc.htm
  inflating: instantclient_12_2/ODBC_IC_Readme_Win.html
  inflating: instantclient_12_2/odbc_install.exe
  inflating: instantclient_12_2/odbc_uninstall.exe
  inflating: instantclient_12_2/sqora32.dll
  inflating: instantclient_12_2/sqoras32.dll
  inflating: instantclient_12_2/sqresja.dll
  inflating: instantclient_12_2/sqresus.dll

$ find /c/apps/oracle/instantclient_12_2/ -type d
/c/apps/oracle/instantclient_12_2/
/c/apps/oracle/instantclient_12_2/help
/c/apps/oracle/instantclient_12_2/help/ja
/c/apps/oracle/instantclient_12_2/help/ja/img
/c/apps/oracle/instantclient_12_2/help/ja/img_text
/c/apps/oracle/instantclient_12_2/help/us
/c/apps/oracle/instantclient_12_2/help/us/img
/c/apps/oracle/instantclient_12_2/help/us/img_text
/c/apps/oracle/instantclient_12_2/sdk
/c/apps/oracle/instantclient_12_2/sdk/admin
/c/apps/oracle/instantclient_12_2/sdk/demo
/c/apps/oracle/instantclient_12_2/sdk/include
/c/apps/oracle/instantclient_12_2/sdk/lib
/c/apps/oracle/instantclient_12_2/sdk/lib/bc
/c/apps/oracle/instantclient_12_2/sdk/lib/msvc
/c/apps/oracle/instantclient_12_2/sdk/lib/msvc/vc14
/c/apps/oracle/instantclient_12_2/vc14

# Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。
$ printenv | grep -i oracle
ORACLE_INSTANT_CLIENT=C:\apps\oracle\instantclient_12_2
PATH=<省略>/c/apps/oracle/instantclient_12_2:<省略>
ORIGINAL_PATH=<省略>/c/apps/composer:/c/apps/oracle/instantclient_12_2:<省略>

# ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。
$ printenv | grep -e TNS_ADMIN -e NLS_LANG
NLS_LANG=Japanese_Japan.AL32UTF8
TNS_ADMIN=C:\apps\oracle\instantclient_12_2

# ORACLE ODBCドライバをインストールします。
$ cd $ORACLE_INSTANT_CLIENT

$ odbc_install JA
Oracle ODBC Driver is installed successfully.

# SQL*Plusを起動してみます。
$ sqlplus {ユーザ名}/{パスワード}@{データベース}:1521/{サービス名}

SQL*Plus: Release 12.2.0.1.0 Production on 火 128 10:18:28 2020

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

最終正常ログイン時間: 水 1002 2019 11:27:17 +09:00


Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
SQL>

Windows10 + Oracle Database 12c (12.2.0.1.0)のInstant Client 32bit

  1. Instant Client for Windows 32-bitからパッケージをダウンロードします。
    • instantclient-basiclite-nt-12.2.0.1.0.zip
    • instantclient-sqlplus-nt-12.2.0.1.0.zip
    • instantclient-sdk-nt-12.2.0.1.0.zip
    • instantclient-jdbc-nt-12.2.0.1.0.zip
    • instantclient-odbc-nt-12.2.0.1.0-2.zip
# ダウンロードしたものをすべて解凍して1つのフォルダにまとめて配置します。
$ find ~/Downloads/ -name '*.zip' | xargs -n1 unzip -d /c/app/oracle/
Archive:  /c/Users/m-uki/Downloads/instantclient-basiclite-nt-12.2.0.1.0.zip
   creating: /c/app/oracle/instantclient_12_2/
  inflating: /c/app/oracle/instantclient_12_2/oraocci12.sym
  inflating: /c/app/oracle/instantclient_12_2/oraociicus12.dll
  inflating: /c/app/oracle/instantclient_12_2/uidrvci.sym
  inflating: /c/app/oracle/instantclient_12_2/ocijdbc12.dll
  inflating: /c/app/oracle/instantclient_12_2/xstreams.jar
  inflating: /c/app/oracle/instantclient_12_2/orasql12.sym
  inflating: /c/app/oracle/instantclient_12_2/oraocci12d.dll
  inflating: /c/app/oracle/instantclient_12_2/genezi.exe
  inflating: /c/app/oracle/instantclient_12_2/ojdbc8.jar
  inflating: /c/app/oracle/instantclient_12_2/adrci.exe
  inflating: /c/app/oracle/instantclient_12_2/BASIC_LITE_README
  inflating: /c/app/oracle/instantclient_12_2/oraocci12d.sym
  inflating: /c/app/oracle/instantclient_12_2/orasql12.dll
  inflating: /c/app/oracle/instantclient_12_2/oraociicus12.sym
  inflating: /c/app/oracle/instantclient_12_2/oraocci12.dll
  inflating: /c/app/oracle/instantclient_12_2/ocijdbc12.sym
  inflating: /c/app/oracle/instantclient_12_2/orannzsbb12.dll
  inflating: /c/app/oracle/instantclient_12_2/ociw32.sym
  inflating: /c/app/oracle/instantclient_12_2/adrci.sym
   creating: /c/app/oracle/instantclient_12_2/vc14/
  inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12d.sym
  inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12d.dll
  inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12.dll
  inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12.sym
  inflating: /c/app/oracle/instantclient_12_2/oci.dll
  inflating: /c/app/oracle/instantclient_12_2/oraons.dll
  inflating: /c/app/oracle/instantclient_12_2/genezi.sym
  inflating: /c/app/oracle/instantclient_12_2/ociw32.dll
  inflating: /c/app/oracle/instantclient_12_2/oci.sym
  inflating: /c/app/oracle/instantclient_12_2/uidrvci.exe
  inflating: /c/app/oracle/instantclient_12_2/orannzsbb12.sym
Archive:  /c/Users/m-uki/Downloads/instantclient-jdbc-nt-12.2.0.1.0.zip
  inflating: /c/app/oracle/instantclient_12_2/orai18n-mapping.jar
  inflating: /c/app/oracle/instantclient_12_2/JDBC_README
  inflating: /c/app/oracle/instantclient_12_2/heteroxa12.dll
  inflating: /c/app/oracle/instantclient_12_2/heteroxa12.sym
  inflating: /c/app/oracle/instantclient_12_2/orai18n.jar
Archive:  /c/Users/m-uki/Downloads/instantclient-odbc-nt-12.2.0.1.0-2.zip
   creating: /c/app/oracle/instantclient_12_2/help/
   creating: /c/app/oracle/instantclient_12_2/help/ja/
  inflating: /c/app/oracle/instantclient_12_2/help/ja/blafdoc.css
  inflating: /c/app/oracle/instantclient_12_2/help/ja/cpyr.htm
   creating: /c/app/oracle/instantclient_12_2/help/ja/img/
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/odbcdrvarch.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/odbcmodel.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_app.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_ora.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_ssmig.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_work.gif
   creating: /c/app/oracle/instantclient_12_2/help/ja/img_text/
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/odbcdrvarch.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/odbcmodel.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_app.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_ora.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_ssmig.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_work.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/map.xml
  inflating: /c/app/oracle/instantclient_12_2/help/ja/oracle.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/sqora.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/toc.htm
   creating: /c/app/oracle/instantclient_12_2/help/us/
  inflating: /c/app/oracle/instantclient_12_2/help/us/blafdoc.css
  inflating: /c/app/oracle/instantclient_12_2/help/us/cpyr.htm
   creating: /c/app/oracle/instantclient_12_2/help/us/img/
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/odbcdrvarch.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/odbcmodel.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_app.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_ora.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_ssmig.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_work.gif
   creating: /c/app/oracle/instantclient_12_2/help/us/img_text/
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/odbcdrvarch.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/odbcmodel.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_app.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_ora.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_ssmig.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_work.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/map.xml
  inflating: /c/app/oracle/instantclient_12_2/help/us/oracle.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/sqora.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/toc.htm
  inflating: /c/app/oracle/instantclient_12_2/ODBC_IC_Readme_Win.html
  inflating: /c/app/oracle/instantclient_12_2/odbc_install.exe
  inflating: /c/app/oracle/instantclient_12_2/odbc_uninstall.exe
  inflating: /c/app/oracle/instantclient_12_2/sqora32.dll
  inflating: /c/app/oracle/instantclient_12_2/sqoras32.dll
  inflating: /c/app/oracle/instantclient_12_2/sqresja.dll
  inflating: /c/app/oracle/instantclient_12_2/sqresus.dll
Archive:  /c/Users/m-uki/Downloads/instantclient-sdk-nt-12.2.0.1.0.zip
   creating: /c/app/oracle/instantclient_12_2/sdk/
   creating: /c/app/oracle/instantclient_12_2/sdk/admin/
  inflating: /c/app/oracle/instantclient_12_2/sdk/admin/oraaccess.xsd
  inflating: /c/app/oracle/instantclient_12_2/sdk/ott.bat
   creating: /c/app/oracle/instantclient_12_2/sdk/demo/
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidml.cpp
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occiobj.typ
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occiobj.cpp
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/cdemo81.c
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidemod.sql
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/make.bat
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/bcmake.bat
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidemo.sql
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/oraaccess.xml
  inflating: /c/app/oracle/instantclient_12_2/sdk/SDK_README
   creating: /c/app/oracle/instantclient_12_2/sdk/lib/
   creating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oramysql12.lib
   creating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/oraocci12d.lib
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/oraocci12.lib
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/ociw32.lib
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oraocci12d.lib
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oraocci12.lib
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oci.lib
   creating: /c/app/oracle/instantclient_12_2/sdk/lib/bc/
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/bc/oci.lib
   creating: /c/app/oracle/instantclient_12_2/sdk/include/
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociapr.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiCommon.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ori.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci8dp.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ldap.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixstream.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/odci.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ort.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occi.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiObjects.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixml.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiData.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci1.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/xa.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/oratypes.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/nzerror.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiControl.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidem.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiAQ.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/oro.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidef.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/orid.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixmldb.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociextp.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/nzt.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocikpr.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/orl.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidfn.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociap.h
 extracting: /c/app/oracle/instantclient_12_2/sdk/ottclasses.zip
Archive:  /c/Users/m-uki/Downloads/instantclient-sqlplus-nt-12.2.0.1.0.zip
  inflating: /c/app/oracle/instantclient_12_2/sqlplus.exe
  inflating: /c/app/oracle/instantclient_12_2/SQLPLUS_README
  inflating: /c/app/oracle/instantclient_12_2/glogin.sql
  inflating: /c/app/oracle/instantclient_12_2/orasqlplusic12.dll
  inflating: /c/app/oracle/instantclient_12_2/sqlplus.sym

$ find /c/app/oracle/instantclient_12_2/ -type d
/c/app/oracle/instantclient_12_2/
/c/app/oracle/instantclient_12_2/help
/c/app/oracle/instantclient_12_2/help/ja
/c/app/oracle/instantclient_12_2/help/ja/img
/c/app/oracle/instantclient_12_2/help/ja/img_text
/c/app/oracle/instantclient_12_2/help/us
/c/app/oracle/instantclient_12_2/help/us/img
/c/app/oracle/instantclient_12_2/help/us/img_text
/c/app/oracle/instantclient_12_2/sdk
/c/app/oracle/instantclient_12_2/sdk/admin
/c/app/oracle/instantclient_12_2/sdk/demo
/c/app/oracle/instantclient_12_2/sdk/include
/c/app/oracle/instantclient_12_2/sdk/lib
/c/app/oracle/instantclient_12_2/sdk/lib/bc
/c/app/oracle/instantclient_12_2/sdk/lib/msvc
/c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14
/c/app/oracle/instantclient_12_2/vc14

# Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。
# ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。
$ printenv | grep -i -e instant -e NLS_LANG
NLS_LANG=Japanese_Japan.AL32UTF8
TNS_ADMIN=C:\app\oracle\instantclient_12_2
PATH=<省略>/c/app/oracle/instantclient_12_2

# SQL*Plusを起動してみます。
$ sqlplus

SQL*Plus: Release 12.2.0.1.0 Production on 火 128 21:42:39 2020

Copyright (c) 1982, 2017, Oracle.  All rights reserved.

ユーザー名を入力してください:

Ubuntu18 + Oracle Database 12c (12.2.0.1.0)のInstant Client 64bit

ponsuke-tarou.hatenablog.com

IPヘッダにあるプロトコル番号でプロトコルを識別できます。

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

IPv4において,IPパケットで送られているデータが,ICMPメッセージであることを識別できるヘッダ情報はどれか。

  1. IPヘッダのプロトコル番号
  2. MACヘッダのイーサタイプ値
  3. TCPヘッダのコントロールフラグ
  4. UDPヘッダの宛先ポート番号

平成30年春期問18 ICMPを識別できるヘッダ情報|情報処理安全確保支援士.com

IPv4は、32 ビット (4 バイト) を4つに「.」で区切って表すIPです。

www.weblio.jp

IPv6は、IPv4よりたくさん割り当てられるように128 ビット (16 バイト)で表すIPです。

IPv6アドレスは『128bit』で構成されます。これは2^128通りのアドレス数を保有することになります。
IPv4とIPv6の違いについて | Netassist Blog

ICMPは、IPにおいて制御や調査に用いられるプロトコルです。

  • 正式名称:Internet Control Message Protocol

IPプロトコルの「エラー通知」や「制御メッセージ」を転送するためのプロトコルです。TCP/IPが実装されたコンピュータ間で、通信状態を確認するために使用されます。 ICMPはインターネット層(OSI参照モデルネットワーク層)で動作するプロトコルです。
TCP/IP - ICMPとは

f:id:ponsuke_tarou:20180904164518g:plain
※. ベースの図は、以下のサイト様より拝借いたしました。
TCP/IPをはじめから

ICMP Flood攻撃 と Smurf攻撃は、ICMPのpingを使った攻撃です。

ping の正体は、ICMP の中で一番有名な使われ方である『Ping 要求【Echo Request】』と『Ping 応答【Echo Reply】』で、これは宛先 IP アドレスを 指定して Ping 要求を送り、その宛先まで到達できれば送信元へ Ping 応答を返します。
https://milestone-of-se.nesuke.com/wp-content/uploads/2016/12/icmp-reply.png
【図解】ICMPとは 〜Pingの仕組みやエラー通知によるIP通信の補助〜 | SEの道標

ICMP Flood攻撃は、pingコマンドを用いて大量の要求パケットを発信することによって、攻撃対象のサーバに至るまでの回線を過負荷にしてアクセスを妨害します。
  • 英語 : ICMP Flood(洪水)

攻撃対象となるサーバに対してなるべくサイズが大きくなるようにした「ICMP echo request(ping)」を大量に送り続けることで、攻撃対象および攻撃対象が属するネットワークのリソースを枯渇させることを目的とする攻撃です。
https://www.sc-siken.com/kakomon/29_haru/img/18.gif
情報セキュリティスペシャリスト平成29年春期 午前Ⅱ 問18

Smurf攻撃は、IPアドレスを詐称してICMPの応答パケットを大量に送り付けます。

Smurf攻撃(スマーフアタック)は、ネットワークの疎通確認に使用されるICMP echo request(ping)の仕組みを悪用して、相手のコンピュータやネットワークに大量のパケットを送りつける反射型のDoS攻撃です。
攻撃者は、以下の手順で攻撃対象のサービスを妨害します。
①送信元IPアドレスを攻撃対象のコンピュータに偽装したICMP echo requestを攻撃対象が属するネットワークにブロードキャストで大量に送りつける
②ICMP echo requestを受け取ったネットワーク内の端末が一斉に攻撃対象にecho replyパケットで応答する
③大量の応答パケットの発生により攻撃対象のコンピュータおよびネットワークが過負荷状態になり正常なサービスが阻害される
情報セキュリティスペシャリスト平成26年秋期 午前Ⅱ 問12

http://www.k-fix.jp/skill/network/icmp/img/03_01.gif
株式会社K-fix

ICMP Flood攻撃 と Smurf攻撃の違いは、IPアドレスの詐称と目的です。
ICMP Flood攻撃 Smurf攻撃
IPアドレスの詐称 なし リクエストの送信元IPアドレスに自分ではなく標的のアドレスを設定し、
標的の所属するネットワークのブロードキャストアドレス当てに大量に送りつける
目的 標的のアドレスに対して大量のPing 要求を送りつけることで過負荷にさせる 標的のアドレスに対して大量のPing 応答を送りつけることで過負荷にさせる

プロトコル番号は、IPにおいてプロトコル毎に割り振られた番号です。

プロトコル番号とは、IP(Internet Protocol)で通信する際に、上位層のプロトコルがなんであるかを識別するための番号。IPデータグラムのヘッダ部に8ビットの値として記載されるもので、0から255までのいずれかとなる。
プロトコル番号とは - IT用語辞典 e-Words

プロトコル番号は、上位層のプロトコルを識別するための番号であり、IPヘッダに 8 ビット情報であります。例えばプロトコル番号が 6 の場合はTCP、17 の場合はUDPとなります。プロトコル番号の枠は0~255です。
f:id:ponsuke_tarou:20180904174136p:plain
IPプロトコル番号一覧

プロトコル番号がわかるとプロトコルに何を使っているかがわかります。

IANAのプロトコル番号の一部はこんな感じです。

Decimal Keyword Protocol
1 ICMP Internet Control Message
4 IPv4 IPv4 encapsulation
6 TCP Transmission Control
17 UDP User Datagram
41 IPv6 IPv6 encapsulation
ICMPのプロトコル番号は「1」です。

プロトコル番号は、Internet Protocol(IP)の宛先情報を含めているIPヘッダーに入っています。

https://www.infraexpert.com/studygif/tcpip4.gif
TCP/IP - IPとは

ICMPフレームの部分は、データ本体であるIPペイロードに入っています。

https://www.sc-siken.com/kakomon/30_haru/img/18.gif
平成30年春期問18 ICMPを識別できるヘッダ情報|情報処理安全確保支援士.com

ICMPフレーム部分でタイプ番号とそのコード番号がわかります。

ICMPのタイプ一覧

Type 意味
0 エコー応答(Ping要求 / Echo Request)
3 宛先到達不能
4 始点抑制
5 最適経路への変更指示
8 エコー要求(Ping応答 / Echo Reply)
9 ルータ通知
10 ルータ要求
11 TTL超過によるパケット破棄の報告
12 パケットパラメータにおけるエラー
13 タイムスタンプ
14 タイムスタンプ応答
15 インフォメーション要求
16 インフォメーション応答
17 アドレスマスク要求
18 アドレスマスク応答

f:id:ponsuke_tarou:20180904163142p:plain
TCP/IP通信プログラミング Ver.2 ICMPとPINGコマンド

f:id:ponsuke_tarou:20180904163845p:plain
第12回 TCP/IPプロトコルを支えるICMPメッセージ (1/3):基礎から学ぶWindowsネットワーク - @IT

f:id:ponsuke_tarou:20180904211559j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com