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

Spring MVC で簡単そうなエコーアプリを作って基本を学ぶ

前回は、プロジェクトに Spring MVC を設定したので簡単なアプリを作ってみます。

ponsuke-tarou.hatenablog.com

環境

ここで作るエコーアプリはこの本のSpring MVCの章にあるものです。

トップ画面から遷移した入力画面で値を入力して出力画面に表示します。
www.shoeisha.co.jp

トップ画面を作ります。

Controllerを作ります。

f:id:ponsuke_tarou:20180618154305p:plain

package example.app;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/** トップ画面用のController. */
@Controller
public class WelcomeController {
    /**
     * トップ画面の表示リクエストをハンドリングするためのメソッド.
     * RequestMappingアノテーションに"/"を指定することで、"/"というパスに対するリクエストがこのメソッドにマッピングされる.
     * @return トップ画面のView名.
     */
    @RequestMapping("/")
    public String home() {
        // トップ画面に表示するView名として"index"を返却すると「/src/main/webapp/index.jsp」が呼び出される。
        return "index";
    }
}

Viewを作成します。

以前、ViewResolverを設定しました。これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。

index.jspを「/src/main/webapp/index.jsp」へ移動します。

以前、作ったindex.jspを表示できるようにControllerの@RequestMappingに合わせた場所へ移動します。
ponsuke-tarou.hatenablog.com
f:id:ponsuke_tarou:20180618160651p:plain

Tomcatを起動してindex.jspを表示してみます。

ponsuke-tarou.hatenablog.com
f:id:ponsuke_tarou:20180618161841p:plain

index.jspにエコーアプリケーションの入力画面を表示するリクエストを送信するリンクを追加します。

「c: 」は、以前プロジェクトにSpringを設定する中でJSPで使えるように設定しました。

<html>
<body>
    <h2>Hello World!</h2>
    <ul>
        <!--
         JSTL(JSP Standerd Tag Library)の「c:url」を使用して
         {アプリケーションのコンテキストパス} + "/echo"へのリンクを追加しています.
         -->
        <li><a href="<c:url value='/echo' />">エコーアプリケーションへ</a></li>
    </ul>
</body>
</html>
リンクが追加されたことを画面を表示して確認します。

f:id:ponsuke_tarou:20180618163551p:plain

入力画面を作成します。

HTMLのform要素内の入力値を保持するためのフォームクラスを作成します。

package example.app;

import java.io.Serializable;

/**
 * HTMLの<form>要素内で取り扱う入力値を保持するフォームクラス.
 */
public class EchoForm implements Serializable {

    /** serialVersionUID. */
    private static final long serialVersionUID = -3147370534900886671L;

    /** 入力値を保持するプロパティ定義. */
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

Controllerを作成して表示リスクエストをハンドリングするためのメソッドを実装します。

package example.app;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * 入力画面のController.
 * RequestMappingアノテーションで指定する"echo"により"/echo"というパスのリクエストがこのControllerにマッピングされます.
 */
@Controller
@RequestMapping("echo")
public class EchoController {
    /**
     * 表示リスクエストをハンドリングするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.GETを指定することで"GET /echo"というリクエストがこのメソッドにマッピングされます.
     * @param model
     * @return 入力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.GET)
    public String viewInput(Model model) {
        // フォームオブジェクトを生成してModelに追加します。
        EchoForm form = new EchoForm();
        // 属性名を省略しているため、クラス名の"echoForm"という属性名で追加されます。
        // Modelに追加したオブジェクトは、HttpServletRequestにエクスポートされる仕組みとなっているため
        // JSPからは、リクエストスコープのオブジェクトとして参照できます。
        model.addAttribute(form);
        return "echo/input";
    }
}

Controllerのメソッドの返却値"echo/input"に合わせて「/WEB-INF/echo/input.jsp」で入力画面のViewを作成します。

<html>
<body>
    <h2>入力画面</h2>
    <!--
     Spring MVCから提供されている「form:form」要素を使用して、HTMLのフォームを作成すします.
     modelAttribute属性にフォームオブジェクトの属性名を指定します.
     「form:form」要素にはmethod/action属性が指定でき、省略すると
     method属性は"post"、action属性は画面表示時URLのアプリケーションのコンテキストパス以降の値 となります.
     ここのaction属性は、"{App名}/echo"となります.
     -->
    <form:form modelAttribute="echoForm">
        <div>テキストを入力してください :</div>
        <div>
            <!--
             Spring MVCから提供されている「form:input」要素を使用して、テキストフィールドを作成します.
             path属性に指定したechoForm(modelAttribute属性で指定)のプロパティが保持する値が初期値として表示されます.
             -->
            <form:input path="text" />
        </div>
        <div>
            <!-- Spring MVCから提供されている「form:button」要素を使用して、HTMLフォームの送信ボタンを作成します。 -->
            <form:button>送信</form:button>
        </div>
    </form:form>
</body>
</html>
トップ画面のリンクを押下して入力画面を表示してみます。

f:id:ponsuke_tarou:20180618173629p:plain

入力画面の入力値を出力画面に表示する処理を作成します。

入力値送信リクエストをハンドリングするためのメソッドをController(EchoController.java)に追加します。

    /**
     * 入力画面の送信リクエストをハンドリンクするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます.
     * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます.
     *        また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません.
     * @return 出力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.POST)
    public String echo(EchoForm form) {
        return "echo/output";
    }

Controllerのメソッドの返却値"echo/output"に合わせて「/WEB-INF/echo/output.jsp」で出力画面のViewを作成します。

<html>
<body>
    <h2>出力画面</h2>
    <div>入力したテキストは・・・</div>
    <div>
        <!--
         JSTL(JSP Standerd Tag Library)の「c:out」を使用してフォームオブジェクト(echoForm)のプロパティ(text)値をHTMLに出力します.
         「c:out」を使用することで、XSS(クロスサイトスクリプティング)攻撃で使用される特殊な文字を単なる文字としてHTMLに出力できます.
         --><span><c:out value="${echoForm.text}" /></span></div>
    <div>です。</div>
    <br>
    <div>
        <!-- トップ画面を表示するリクエスト(GET /)を送信するリンクです. -->
        <a href="<c:url value='/' />">トップ画面へ戻る</a>
    </div>
</body>
</html>
出力画面を表示してみます。

f:id:ponsuke_tarou:20180618180909p:plainf:id:ponsuke_tarou:20180618180917p:plain

Bean Validationを使用した入力チェックを作成します。

Spring MVCでは、Bean Validationの仕組みを利用してフォームオブジェクトのプロパティに入力チェックルールを指定します。

フォームオブジェクト(EchoForm.java)にBean Validationの制約アノテーションを追加します。

Hibernate Validationは、前回pom.xmlで設定しました。

    /**
     * 入力値を保持するプロパティ定義.
     * Hibernate Validationが提供するNotEmptyアノテーションを付加することで入力必須チェックを行います.
     * Bean Validationが提供するSizeアノテーションを付加することで最大文字数のチェックを行います.
     */
    @NotEmpty
    @Size(max = 10)
    private String text;
Springのプロパティでは未入力時にデフォルトで空文字が設定されるため、必須チェックは @NotNull ではなく @NotEmpty を使用します。

Spring以外のプロパティ値に対しては Bean Validation が提供する @java.validation.constraints.NotNull で必須チェックが行えます。

Controllerの送信リクエストをハンドリンクするためのメソッド(EchoController#echo)でSpring MVCの入力チェック機能を有効化してエラーのハンドリング処理を追加します。

    /**
     * 入力画面の送信リクエストをハンドリンクするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます.
     * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます.
     *        また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません.
     *        <<入力チェック>>
     *        パラメータのフォームオブジェクトに Validアノテーションを付与することで、入力チェックを実施してその結果を BindingResult に格納できます.
     * @param result BindingResultは入力チェックするフォームオブジェクトの直後に指定します.
     *        BindingResult もModelに自動的に追加されるため、明示的にModelに追加する必要はありません.
     * @return 出力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.POST)
    public String echo(@Valid EchoForm form, BindingResult result) {
        // BindingResult#hasErrorsを呼び出すことで入力チェックのエラー判定を行います。
        if (result.hasErrors()) {
            // エラーの場合は、入力画面のView名を返却し、入力画面にエラー情報を表示します。
            return "echo/input";
        }
        return "echo/output";
    }

View(input.jsp)にエラー情報を表示するパーツを追加します。

            <form:input path="text" />
            <!--
             Spring MVCが提供する「form:errors」要素を使用して、入力チェックのエラー情報を表示します.
             path属性に指定されたプロパティのエラー情報が表示されます。
             -->
            <form:errors path="text" />
        </div>
エラーになったときの入力画面を表示してみます。

f:id:ponsuke_tarou:20180618231043p:plainf:id:ponsuke_tarou:20180618231046p:plainf:id:ponsuke_tarou:20180618231050p:plainf:id:ponsuke_tarou:20180618231059p:plain

この本を読みながらやりました

www.shoeisha.co.jp

SpringプロジェクトにSpring MVCを設定する。

前回は、Springのプロジェクトを作ってTomcatを設定するところまでやりました。

ponsuke-tarou.hatenablog.com

環境

Spring MVC を設定します。

pom.xmlに依存関係を追加します。

  • pom.xml に追記して依存関係を追加していきます。
Spring MVC のモジュールを指定します。

spring-webmvc を指定すると Spring Web やその他のSpring Frameworkの依存モジュールへの依存関係を解決できます。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>
Hibernate(ハイバネート) Validator を指定します。

Hibernate Validatorは、Bean Validation のリファレンス実装です。
Spring MVC は Bean Validation の仕組みを利用して入力チェックをします。
fits.hatenablog.com
you-tk.hatenablog.com

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
JCL inplement over SLF4 と Logback を指定します。

Spring はJCL(Apache Commons Logging)のAPIを使ってログ出力を行います。
そのため、SLF4JのAPIにロギング処理をブリッジするJCLの実装クラスを提供するライブラリである JCL inplement over SLF4 と
SLF4Jの実装クラスを提供するライブラリであるLogbackを指定します。
ponsuke-tarou.hatenablog.com

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

ContextLoaderListener のセットアップ

ContextLoaderListener クラスをサーブレットコンテナに登録することで、Webアプリケーション用のアプリケーションコンテキストを生成できます。
www.weblio.jp
qiita.com

空のコンフィギュレーションクラスを作成します。
package example.config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
}
作成したコンフィギュレーションクラスをweb.xmlに設定して、アプリケーションコンテキストを生成できるようにします。

src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <listener>
    <!-- ContextLoaderListenerクラスをサーブレットコンテナのリスナクラスとして指定します. -->
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <context-param>
    <!-- AnnotationConfigWebApplicationContextクラスをサーブレットコンテナのパラメータに指定します. -->
    <param-name>contextClass</param-name>
    <param-value>
        org.springframework.web.context.support.AnnotationConfigWebApplicationContext
    </param-value>
  </context-param>
  <context-param>
    <!-- 作成したコンフィギュレーションクラスをサーブレットコンテナのパラメータに指定します. -->
    <param-name>contextConfigLocation</param-name>
    <param-value>example.config.AppConfig</param-value>
  </context-param>

DispatcherServlet のセットアップ

DispatcherServletクラスをサーブレットコンテナに登録することで、Spring MVC のフロントコントローラを利用できるようにします。
Spring MVCではWebアプリケーション用のアプリケーションコンテキストとは別に、DispatcherServlet 用のアプリケーションコンテキストを作成します。

DispatcherServlet 用のコンフィギュレーションクラスを作成します。
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.WebMvcConfigurerAdapter;

/**
 * DispatcherServlet用のコンフィギュレーションクラス.
 * EnableWebMvcアノテーション を指定すると、Spring MVC を利用するために必要となるコンポーネントのBean定義が自動で行われる.
 * ComponentScanアノテーション を指定すると、value属性に指定されたパッケージの配下にある Component や Controller などの
 * アノテーションを付与したクラスがスキャンされ、アプリケーションコンテキストにBean登録される.
 */
@Configuration
@EnableWebMvc
@ComponentScan("example.app")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    // WebMvcConfigurerAdapterクラスを継承すると、デフォルトで適用されるBean定義を簡単にカスタマイズできる。
}
DispatcherServletクラスをサーブレットコンテナに登録します。

src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>
      <!-- DispatcherServletクラスをサーブレットコンテナに登録します. -->
      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>
      <param-value>example.config.WebMvcConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <!-- DispatcherServlet を使用してリクエストをハンドリングするURLのパターンを定義します. -->
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

日本語が文字化けしないようにCharacterEncordingFilter のセットアップをします。

CharacterEncordingFilterクラスをサーブレットコンテナに登録することで、画面から入力した日本語が文字化けしないようにします。
src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>
      <!-- CharacterEncodingFilterクラスをサーブレットコンテナに登録します. -->
      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パラメータにリクエストとレスポンスの文字エンコーディングを上書きするかを指定します.
       trueを指定してリクエストは強制的に指定したUTF-8に上書きされ、レスポンスもUTF-8となります.
       -->
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <!-- CharacterEncodingFilterを適用するリクエストのURLパターンを指定します. -->
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Viewを判別できるように ViewResolver をセットアップします。

Spring MVC では、ViewResolver を使用してView名を解決して使用するViewを判別します。
以下メソッドを作成したWebMvcConfigに追加します。

    /** ViewResolverのセットアップ用メソッド. */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        // ViewResolverRegistryクラスのjspメソッドを呼び出し JSP 用のViewResolverをセットアップします。
        // これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。
        registry.jsp();
    }

JSPからSpring MVCのtaglibが利用できるように定義を追加します。

以前作成したinclude.jspに定義を追加します。
ponsuke-tarou.hatenablog.com

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

次回は、簡単なアプリを作ってみます。

ponsuke-tarou.hatenablog.com

この本を読みながらやっています。

www.shoeisha.co.jp

コモン・マロウの葉っぱを食べてみた。

天ぷらにしてみた。

味がしない・・・花も単品でお茶にすると味がしない・・・体にいいからいいか。
f:id:ponsuke_tarou:20180609215853j:plain

サラダにしてみた。

味がしない・・・何にでも合わせられるともいえる。
f:id:ponsuke_tarou:20180616140012j:plain

炒めてみた。

初めて味がした。ほうれん草っぽいような気がする。
f:id:ponsuke_tarou:20180616140100j:plain

うちのブルーマロウさんの写真集

f:id:ponsuke_tarou:20180528185112j:plain
苗を植えて1ヵ月ぐらい
f:id:ponsuke_tarou:20180707103336j:plain
2018-07-07 初めて花が咲いた



ponsuke-tarou.hatenablog.com

Springのプロジェクトにプロジェクトファセットを設定する。

Tomcatを設定したのでプロジェクトファセットを設定します。
ponsuke-tarou.hatenablog.com

ファセットで、プロジェクトが使うものの定義をします。

  • ファセットの和訳 : 〔宝石などの〕面を刻む、〔物事の一つの〕相、様相

ファセットは、Java EE プロジェクトの特性および要件を定義し、ランタイム構成の一部として使用されます。
ファセットをプロジェクトに追加すると、そのプロジェクトは、特定のタスクを実行し、特定の要求を実現し、または特定の特性を持つように構成されます。
プロジェクト・ファセット

プロジェクトの作成時にはさまざまな情報が収集され、それらに基づいてプロジェクト タイプの特定、標準ライブラリの追加、コンパイラ オプションの設定、パブリッシュ タスクの制御、ビルド パスの設定、アノテーション プロセッサの追加などが行われます。これらの情報は、プロジェクトの作成中にファセットを選択することによって指定します。
http://otndnld.oracle.co.jp/document/products/wlw/docs103/guide/ideuserguide/projects/conFacets.html

Eclipseでプロジェクトファセットを設定します。

  1. [Packge Exploer]でプロジェクトを選択します。
  2. 「Command + I」でプロジェクトの設定画面を開きます。
  3. 左側のメニューで[Progect Facets]を選択します。
  4. [Convert to Faceted...]リンクを押下します。f:id:ponsuke_tarou:20180311225506p:plain
  5. [Project Facet]の一覧で[Java]にチェックを入れて[Version]を「1.8」にします。
  6. [Dynamic Web Module]にチェックを入れて[Version]を「3.1」にします。
  7. 下の方に出てくる[Further configuration available...]リンクを押下します。f:id:ponsuke_tarou:20180311230123p:plain
  8. [Modify Faceted Project]画面で以下を設定します。
    • Content directory : /WebContent
      • HTMLや、CSSや、画像ファイルなどのコンテンツを格納するディレクトリルートです。
      • デフォルトで入っていたらそのままで。
    • Generate web.xml....... : チェックする
  9. [OK]ボタンを押下します。
  10. [Dynamic Web Module]で[Runtimes]を押下します。
  11. [Apatch Tomcat v8.0]にチェックを入れます。f:id:ponsuke_tarou:20180311230759p:plain
  12. [Apply] > [OK]ボタンを押下します。

f:id:ponsuke_tarou:20180606155313j:plain