Slack-Python-Onboarding-Tutorialをできるように Slack側の準備をします。

前回は、Slack-Python-Onboarding-Tutorial をできるようにローカル環境に必要なものを準備しました。

ponsuke-tarou.hatenablog.com

今回は、Slack-Python-Onboarding-Tutorialをできるように Slack側の準備をします。

チュートリアル用のSlack AppとBotユーザーを作成します。

github.com

新規にSlack Appをapi.slack.comで作ります。

api.slack.com
f:id:ponsuke_tarou:20190111165403p:plainf:id:ponsuke_tarou:20190111165424p:plainf:id:ponsuke_tarou:20190111165802p:plain

作ったAppがSlackと対話できるようにBotユーザを作ります。

f:id:ponsuke_tarou:20190111171209p:plainf:id:ponsuke_tarou:20190111171222p:plain

作ったBotにイベントを登録します。

github.com

Ngrokを起動して一時的に外部からローカルへアクセスするURLを取得します。

$ ngrok http 8080

ngrok by @inconshreveable                                                                                                            (Ctrl+C to quit)
                                                                                                                                                     
Session Status                online                                                                                                                 
Session Expires               7 hours, 57 minutes                                                                                                    
Version                       2.2.8                                                                                                                  
Region                        United States (us)                                                                                                     
Web Interface                 http://127.0.0.1:4040                                                                                                  
Forwarding                    http://cd36dfb5.ngrok.io -> localhost:8080                                                                             
Forwarding                    https://cd36dfb5.ngrok.io -> localhost:8080                                                                            
                                                                                                                                                     
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                            
                              0       0       0.00    0.00    0.00    0.00          

app.pyを起動します。

Ngrokを起動したターミナルとは別のターミナルを起動してapp.pyを起動します。

(slackTutorial) $ python3 app.py 
 * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 218-532-055

Slackの[Enable Events]をONにします。

[Request URL]には、{Ngrokで表示されているURL} + {app.pyのhearsメソッドのルートである/listening} の値を設定します。
ちゃんとサーバを使用している場合は、そのサーバのURLを設定します。
{Ngrokで表示されているURL}は、起動のたびに変わるのでその都度[Change]ボタンで[Request URL]を変えます。
f:id:ponsuke_tarou:20190128225347p:plain

[Subscribe to Bot Events]でBotにイベントを登録します。

ページの下の方にある[Subscribe to Bot Events]の[Add Bot User Event]ボタンでBotにイベントを登録します。
登録が終わったら[Save Changes]ボタンで保存します。
f:id:ponsuke_tarou:20190128230532p:plain

環境変数にアプリの資格情報を設定します。

チュートリアルBotでは、osモジュールを使用して環境変数からアプリの資格情報を読み込んで利用します。
そのため、環境変数に資格情報を設定する必要があります。

# bot.py
# -*- coding: utf-8 -*-
u"""lack-Python-Onboarding-TutorialのBotクラス."""
import os
import message
# 省略
        # When we instantiate a new bot object, we can access the app
        # credentials we set earlier in our local development environment.
        self.oauth = {"client_id": os.environ.get("CLIENT_ID"),
                      "client_secret": os.environ.get("CLIENT_SECRET"),
                      # Scopes provide and limit permissions to what our app
                      # can access. It's important to use the most restricted
                      # scope that your app will need.
                      "scope": "bot"}
        self.verification = os.environ.get("VERIFICATION_TOKEN")
# 省略
  1. アプリの[Basic Information]ページで、[Client ID][Client Secret][Verification Token]をコピーします。
    • https://cloud.githubusercontent.com/assets/4828352/20548888/198e2270-b0dc-11e6-9a92-5fe3842be4ba.png
  2. .bash_profileなどで以下のように環境変数を設定します
    • f:id:ponsuke_tarou:20190129234300p:plain
      .bash_profileの場合

認証の設定を行います。

github.com

  1. 左サイドのメニューにある[OAuth & Permissions]からページを開いて[Redirect URLs]を設定します。
  2. [Add New Redirect URL]ボタンを押下してRedirect URLを入力し、[Add]ボタンで追加します。
    • Redirect URLには、{Ngrokで表示されているURL} + {app.pyのthanksメソッドのルートである/thanks} の値を設定します。
    • {Ngrokで表示されているURL}は、起動のたびに変わるのでその都度[Change]ボタンで[Request URL]を変えます。
  3. [Save URLs]ボタンを押下して保存します。

f:id:ponsuke_tarou:20190128233556p:plain

思い出の一枚

f:id:ponsuke_tarou:20190111171304j:plain

PythonのウェブフレームワークであるFlaskを学ぶ。

Flaskは、Pythonのウェブフレームワークです。

  • 和英 : (flǽsk)〔実験で使う〕フラスコ〔ウイスキーなどの〕フラスコ瓶

https://a2c.bitbucket.io/flask/_images/logo-full.png
Flaskへ ようこそ — Flask v0.5.1 documentation

Flaskは、Bottleと同じくらい簡単に使えるが、Facebook認証やデータベース統合など、本格的なウェブ開発で役に立つ様々な拡張を備えている。
https://www.oreilly.co.jp/books/images/picture978-4-87311-738-6.gif

ウェブフレームワークは、クライアントからの要求とサーバの応答を処理してくれます。

https://camo.qiitausercontent.com/709d8bdb4a5bb2d9223cc468e21f2dcbcb2cfb19/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f36353331322f63303638613462632d643964372d373363662d353332352d3166346536616538333536632e706e67
Python Webフレームワーク Django vs Pyramid vs Flask 2015年12月 - Qiita

WSGIライブラリのwerkzeugとjinja2が入っています。

WSGIとは、PythonでのWebサーバとWebアプリケーションをつなぐインターフェースを定義した仕様です。

WSGIJavaにおけるJava Servelet APIと同じように,WebサーバとWebアプリケーション間の汎用的なインターフェースを定義しています。WSGIを利用することで,WebサーバとWebアプリケーションの実装を切り離すことができ,WebサーバとWebアプリケーションフレームワークの組み合わせを柔軟に選択することができるようになりました。
gihyo.jp

f:id:ponsuke_tarou:20190108201858p:plain
5. WSGIとPylons - Emerge Technology

https://c-bata.link/webframework-in-python/_images/router.png
ルーティング — c-bata.link

本を見ながら実際にFlaskを使ってみます。

  • 環境
    • macOS Mojave バージョン10.14.2
    • Python 3.6.5
    • pip 18.1

https://www.oreilly.co.jp/books/images/picture978-4-87311-738-6.gif

Flaskをインストールします。

# インストールします。
$ pip3 install flask
Collecting flask
  Downloading https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl (91kB)
    100% |████████████████████████████████| 92kB 701kB/s 
Collecting click>=5.1 (from flask)
  Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
    100% |████████████████████████████████| 81kB 2.3MB/s 
Collecting Jinja2>=2.10 (from flask)
  Downloading https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl (126kB)
    100% |████████████████████████████████| 133kB 1.3MB/s 
Collecting Werkzeug>=0.14 (from flask)
  Downloading https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl (322kB)
    100% |████████████████████████████████| 327kB 2.2MB/s 
Collecting itsdangerous>=0.24 (from flask)
  Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10->flask)
  Downloading https://files.pythonhosted.org/packages/da/fc/2979c425ad23d528d6ac2e1f3efdc28e572fa1e1fbd5a75171cbdd7ddaa5/MarkupSafe-1.1.0-cp36-cp36m-macosx_10_6_intel.whl
Installing collected packages: click, MarkupSafe, Jinja2, Werkzeug, itsdangerous, flask
Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0

# バージョン確認します。
$ flask --version
Flask 1.0.2
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 03:03:55) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
$ pip3 -V
pip 18.1 from /Users/mana/Dropbox/ApacheDcumentRoot/Slack-Python-Onboarding-Tutorial/tryFlask/lib/python3.6/site-packages/pip (python 3.6)

リクエストの入口にする try_flask.py を作ります。

ホーム画面用の index.html を作ります。


jinja2を体験してみます。

jinja2は、Python用のテンプレートエンジンです。

f:id:ponsuke_tarou:20190109223501p:plain
Welcome to Jinja2 — Jinja2 Documentation (2.10)

テンプレートのHTMLを作ります。
# templatesディレクトリを作成して、
$ mkdir templates
# その中にHTMLを作ります。
$ echo -n > templates/jinja2.html

動かしてみます。

$ python3 try_flask.py 
 * Serving Flask app "try_flask" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 256-786-415
127.0.0.1 - - [09/Jan/2019 23:23:34] "GET /echo/ponsuke_tarou HTTP/1.1" 200 -
127.0.0.1 - - [09/Jan/2019 23:24:45] "GET /echo?name=ponsuke_tarou&do=%27write%20HatenaBlog%27 HTTP/1.1" 301 -
127.0.0.1 - - [09/Jan/2019 23:24:45] "GET /echo/?name=ponsuke_tarou&do=%27write%20HatenaBlog%27 HTTP/1.1" 200 -
127.0.0.1 - - [09/Jan/2019 23:34:24] "GET /echo/?name=ponsuke_tarou&do=HatenaBlog%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6 HTTP/1.1" 200 -
 * Detected change in '/path/to/try_flask.py', reloading
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 256-786-415

f:id:ponsuke_tarou:20190109221733p:plain
http://localhost:8080/にアクセスするとホーム画面が表示されました。
f:id:ponsuke_tarou:20190109222336p:plain
http://localhost:8080/echo/ponsuke_tarouにアクセスると引数の「ponsuke_tarou」がちゃんとハマった文字列が返されました。
f:id:ponsuke_tarou:20190109233513p:plain
http://localhost:8080/echo/?name=ponsuke_tarou&do=HatenaBlogを書いて にアクセスするとGETで渡した引数がテンプレートにハマって表示されました。

Slack-Python-Onboarding-Tutorial をできるように必要なものを準備する。

  • 環境
    • OS : macOS Mojave バージョン10.14.1
    • Slack : Web版
    • ブラウザ : Chrome バージョン: 71.0.3578.98(Official Build) (64 ビット)
    • Python : 3.6.5
    • pip : 18.1
    • git : version 2.17.2 (Apple Git-113)

前回は、Incoming webhooksでメッセージを送ってみました。

ponsuke-tarou.hatenablog.com

Incoming webhooksではない方法でメッセージを送れるようにSlack-Python-Onboarding-Tutorialをやりたいとおもいます。

github.com

Onboardingは、新規メンバへの教育的なことです。

jinjibu.jp

今回は、チュートリアルに必要なものを準備します。

Pythonをインストールします。

ponsuke-tarou.hatenablog.com

パッケージ管理ツールのpipはPythonにくっついています。

(google翻訳)python.orgからダウンロードしたPython 2> = 2.7.9またはPython 3> = 3.4を使用している場合、またはvirtualenvまたはpyvenvによって作成された仮想環境で作業している場合は、pipは既にインストールされています。
Installation — pip 19.1.1 documentation

Python開発用の仮想環境を作るツールであるVirtualenv的なものはvenvとしてPythonにくっついています。

(google翻訳)virtualenvは独立したPython環境を作成するためのツールです。
Python 3.3以降、そのサブセットがvenvモジュールの下で標準ライブラリに統合されました。
ただし、venvモジュールはこのライブラリのすべての機能を提供するわけではありません(たとえば、ブートストラップスクリプトを作成できない、ホストpython以外の他のバージョンのPython用の仮想環境を作成できない、再配置できないなど)。
Virtualenv — virtualenv 17.0.0 documentation

venv モジュールは、軽量な "仮想環境" の作成のサポートを提供します。仮想環境には、仮想環境ごとの site ディレクトリがあり、これはシステムの site ディレクトリから分離させることができます。それぞれの仮想環境には、それ自身の Python バイナリ (様々な Python バージョンで環境を作成できます) があり、仮想環境ごとの site ディレクトリに独立した Python パッケージ群をインストールできます。
venv --- 仮想環境の作成 — Python 3.7.3 ドキュメント

チュートリアルリポジトリをクローンします。

f:id:ponsuke_tarou:20190106140937p:plain
URLをコピーする。

# コピーしたURLでクローンします。
$ git clone https://github.com/slackapi/Slack-Python-Onboarding-Tutorial.git
Cloning into 'Slack-Python-Onboarding-Tutorial'...
remote: Enumerating objects: 19, done.
remote: Total 19 (delta 0), reused 0 (delta 0), pack-reused 19
Unpacking objects: 100% (19/19), done.

仮想環境を準備します。

venvで仮想環境を作ります。

qiita.com

# クローンしたディレクトリへ移動します。
$ cd Slack-Python-Onboarding-Tutorial

# 仮想環境を作ります。
$ python3 -m venv slackTutorial

# 仮想環境を有効化します。
$ source slackTutorial/bin/activate

pip3で必要なパッケージをインストールします。

# パッケージをインストールする前に import文でモジュールを検索するディレクトリを確認しておきます。
(slackTutorial) $ python3
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 03:03:55) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/Users/mana/Dropbox/ApacheDcumentRoot/Slack-Python-Onboarding-Tutorial/slackTutorial/lib/python3.6/site-packages']
>>> exit()

# pip3の情報を確認しておきます。
(slackTutorial) $ pip3 show pip
Name: pip
Version: 18.1
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: pypa-dev@groups.google.com
License: MIT
Location: /path/to/Slack-Python-Onboarding-Tutorial/slackTutorial/lib/python3.6/site-packages
Requires: 
Required-by: 

# チュートリアルに必要なパッケージをインストールします。
(slackTutorial) $ pip3 install -r requirements.txt
Collecting click==6.6 (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/1c/7c/10b4132dd952b6a04e37626258825b8aa8c1eb99545f2eb26a77c21efb55/click-6.6-py2.py3-none-any.whl (71kB)
    100% |████████████████████████████████| 71kB 1.6MB/s 
Collecting Flask==0.11.1 (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/63/2b/01f5ed23a78391f6e3e73075973da0ecb467c831376a0b09c0ec5afd7977/Flask-0.11.1-py2.py3-none-any.whl (80kB)
    100% |████████████████████████████████| 81kB 2.6MB/s 
Collecting itsdangerous==0.24 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz (46kB)
    100% |████████████████████████████████| 51kB 10.1MB/s 
Collecting Jinja2==2.8 (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/96/a1/c56bc4d99dc2663514a8481511e80eba8994133ae75eebdadfc91a5597d9/Jinja2-2.8-py2.py3-none-any.whl (263kB)
    100% |████████████████████████████████| 266kB 2.2MB/s 
Collecting MarkupSafe==0.23 (from -r requirements.txt (line 5))
  Downloading https://files.pythonhosted.org/packages/c0/41/bae1254e0396c0cc8cf1751cb7d9afc90a602353695af5952530482c963f/MarkupSafe-0.23.tar.gz
Collecting pyaml==16.9.0 (from -r requirements.txt (line 6))
  Downloading https://files.pythonhosted.org/packages/e3/bb/e920e88da947f3915229dedd7a3c77267d37bcfbfc2e0aa350f33f25f9b3/pyaml-16.9.0.tar.gz
Collecting PyYAML==3.12 (from -r requirements.txt (line 7))
  Downloading https://files.pythonhosted.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz (253kB)
    100% |████████████████████████████████| 256kB 3.1MB/s 
Collecting requests==2.11.1 (from -r requirements.txt (line 8))
  Downloading https://files.pythonhosted.org/packages/ea/03/92d3278bf8287c5caa07dbd9ea139027d5a3592b0f4d14abf072f890fab2/requests-2.11.1-py2.py3-none-any.whl (514kB)
    100% |████████████████████████████████| 522kB 4.2MB/s 
Collecting six==1.10.0 (from -r requirements.txt (line 9))
  Downloading https://files.pythonhosted.org/packages/c8/0a/b6723e1bc4c516cb687841499455a8505b44607ab535be01091c0f24f079/six-1.10.0-py2.py3-none-any.whl
Collecting slackclient==1.0.2 (from -r requirements.txt (line 10))
  Downloading https://files.pythonhosted.org/packages/db/12/e5198d6e10ead20acdbba5f6a7c22d153d8ea08946ea06e4580f6666cb52/slackclient-1.0.2.tar.gz
Collecting websocket-client==0.37.0 (from -r requirements.txt (line 11))
  Downloading https://files.pythonhosted.org/packages/a3/1e/b717151e29a70e8f212edae9aebb7812a8cae8477b52d9fe990dcaec9bbd/websocket_client-0.37.0.tar.gz (194kB)
    100% |████████████████████████████████| 194kB 1.9MB/s 
Collecting Werkzeug==0.11.11 (from -r requirements.txt (line 12))
  Downloading https://files.pythonhosted.org/packages/a9/5e/41f791a3f380ec50f2c4c3ef1399d9ffce6b4fe9a7f305222f014cf4fe83/Werkzeug-0.11.11-py2.py3-none-any.whl (306kB)
    100% |████████████████████████████████| 307kB 5.1MB/s 
Installing collected packages: click, itsdangerous, MarkupSafe, Jinja2, Werkzeug, Flask, PyYAML, pyaml, requests, six, websocket-client, slackclient
  Running setup.py install for itsdangerous ... done
  Running setup.py install for MarkupSafe ... done
  Running setup.py install for PyYAML ... done
  Running setup.py install for pyaml ... done
  Running setup.py install for websocket-client ... done
  Running setup.py install for slackclient ... done
Successfully installed Flask-0.11.1 Jinja2-2.8 MarkupSafe-0.23 PyYAML-3.12 Werkzeug-0.11.11 click-6.6 itsdangerous-0.24 pyaml-16.9.0 requests-2.11.1 six-1.10.0 slackclient-1.0.2 websocket-client-0.37.0

# 一旦仮想環境から抜けます。
$ deactivate

local環境へLANの外からアクセスできるようにするNgrokをインストールします。

If you are running this project locally, you'll need to set up tunnels for Slack to connect to your endpoints. Ngrok is an easy to use tunneling tool that supports HTTPS, which is required by Slack.
github.com

qiita.com

Web API用のテストツールPostmanをインストールします。

You'll likely want to test events coming to your server without going through the actions on your Slack team. Postman is a useful tool you can use to recreate requests sent from Slack to your server. This is especially helpful for events like user join, where the workflow to recreate the event requires quite a bit of set up.
github.com

qiita.com

次回は、Slack側の準備をします。

ponsuke-tarou.hatenablog.com


f:id:ponsuke_tarou:20190106232448j:plain

はじめてのPythonでSlackとつながってみる

  • 環境
    • OS : macOS Mojave バージョン10.14.1
    • Slack : Web版
    • ブラウザ : Chrome バージョン: 70.0.3538.102
    • curl : 7.54.0 (x86_64-apple-darwin18.0)
    • Python : 3.6.5

ponsuke-tarou.hatenablog.com

SlackAPIってなんだ?

api.slack.com

よくわからないでSlackのIncoming Webhooksを実際に使ってみます。

とりあえず概要だけ見ておきます。

Webhookとは?

  • アプリケーションの更新情報を他のアプリケーションへリアルタイム提供する仕組みや概念のこと。
  • イベント(リポジトリにプッシュなど)発生時、指定したURLにPOSTリクエストする仕組みのこと。

Webhookの説明を見ると「通知する、Webhookを送る」などの言葉が用いられているが、
これはPOSTリクエストのことを指している。
Webhookとは? - Qiita

じゃ、SlackのIncoming Webhooksって?
get.slack.help

1. Webhockする用のAppを用意する

  1. f:id:ponsuke_tarou:20181121234139p:plain
  2. f:id:ponsuke_tarou:20181121234258p:plain
  3. f:id:ponsuke_tarou:20181121234453p:plain
  4. f:id:ponsuke_tarou:20181121234745p:plain
  5. f:id:ponsuke_tarou:20181121234657p:plain
    [App Name]を入力 > [Department Slack Workspace]を選択 > [Create App]ボタンを押下
  6. f:id:ponsuke_tarou:20181121235053p:plain
    [Incoming Webhooks]を「ON」にする
  7. f:id:ponsuke_tarou:20181121235446p:plain
    同じページの下にある[Add New Webhoock To Workspace]を押下
  8. f:id:ponsuke_tarou:20181127190644p:plainf:id:ponsuke_tarou:20181127190702p:plain

2. Incoming Webhooksを設定する

Incoming Webhooksを設定する

以下サイトの[Incoming Webhooksのエンドポイントを取得する]に従ってIncoming Webhooksを設定する
qiita.com
f:id:ponsuke_tarou:20181127203106p:plain

ちょっと使ってみる

Webhoock URLをゲットする

f:id:ponsuke_tarou:20181127215902p:plain

いろんなプロトコルでデータ転送してくれる curl コマンドを使う

Windowsではインストールが必要
qiita.com

Termialでcurlコマンドを使ってメッセージを送ってみる
# -X <method> : HTTP メソッドの指定
# --data-urlencode name=content : contentをURLエンコードする
curl -X POST --data-urlencode "payload={\"text\": \"初めてWebhoockでメッセージを送信します。\" }" [コピーしたWebhoock URL]

f:id:ponsuke_tarou:20181127222910p:plain
メッセージが届いた。

3. PythonでIncoming Webhooksを使ってSlackにメッセージを送ってみる

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

ponsuke-tarou.hatenablog.com

Requestsを使ってPythonでメッセージを送ってみる

slack_webhook.pyというPythonのファイルを作って実行すると簡単にできた。

import json, requests

WEB_HOOK_URL = "https://hooks.slack.com/services/"
WEB_HOOK_URL += "WebhookURLの後半"
requests.post(WEB_HOOK_URL, data=json.dumps({
    'text': 'PythonでIncoming Webhooksを使ってSlackにメッセージを送ってみる.',
}))
# 作ったコードを実行する。
python3 slack_webhook.py

f:id:ponsuke_tarou:20190105145837p:plain
送られてきたメッセージ

もう少し使ってみる

slack_webhook.pyというPythonのファイルを作って実行するともう少し楽しいメッセージが送信できた。

はじめてのPythonでSlackとつながってみる

f:id:ponsuke_tarou:20190105171241p:plain
もう少し楽しいメッセージが送信できる。

参考にしたサイト

qiita.com
qiita.com


うまく行かなかったこと

リクエストにTokenがなくて not_authed が返却されました。

よくわからないでブラウザのURL欄に https://otsecbsol.slack.com/api/conversations.createと入力してみました・・・。

{"ok":false,"error":"not_authed"}


f:id:ponsuke_tarou:20181128002041j:plain

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