ネットワークにいる機器を監視するSNMPプロトコル

前回の勉強内容

ponsuke-tarou.hatenablog.com

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

ネットワーク管理プロトコルであるSNMPv3で使われるPDUのうち、事象の発生をエージェントが自発的にマネージャに知らせるために使用するものはどれか。ここで、エージェントとはエージェント相当のエンティティ、マネージャとはマネージャ相当のエンティティを指す。

  1. SetRequest-PDU
  2. Response-PDU
  3. SNMPv2-Trap-PDU
  4. GetRequest-PDU

情報処理安全確保支援士平成31年春期 午前Ⅱ 問20

SNMPは、TCP/IPネットワークに接続されている機器の情報を収集して監視や制御を行うためのプロトコルです。

  • 英語 : Simple Network Management Protocol

構成機器や障害時の情報収集を行うために使用されるネットワーク管理プロトコルです。

TCP/IPの環境で使用されるプロトコルのうち,構成機器や障害時の情報収集を行うために使用されるネットワーク管理プロトコルはどれか。

答. SNMP
応用情報技術者平成26年春期 午前問34

SNMPはアプリケーション層のプロトコルです。

TCP/IPネットワークでは、プロトコル階層はアプリケーション層・トランスポート層・インターネット層・ネットワークインタフェース層に分けられている。SNMPと同じ階層に属するものはどれか。

答. FTP
https://www.ap-siken.com/kakomon/18_aki/img/52_1.gif
ソフトウェア開発技術者平成18年秋期 午前問52

https://www.infraexpert.com/studygif/tcpip2.gif
TCP/IPをはじめから

SNMPは、SNMPマネージャとSNMPエージェントの間で使用されます。

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

https://milestone-of-se.nesuke.com/wp-content/uploads/2017/12/snmp-summary-2.png
【図解】SNMPの仕組み~利用ポート,監視方法(マネージャのMIBポーリング/trap受信),tcp/udp,writeの実装例〜│SEの道標

監視を行うのがSNMPマネージャです。

WindowsサーバーやUNIXサーバーにインストールされます。

いろんな製品があります。

https://www.hinemos.info/sites/default/files/2019-09/MonicolleAbout2.PNG
特長・メリット(Hinemos Monicolle) | Hinemos

https://www.nagios.com/wp-content/uploads/2017/10/XI_Home_Dashboard.png
Nagios XI - Easy Network, Server Monitoring and Alerting

https://www.manageengine.jp/products/OpManager/images/mib-browser-snmp-oid.png
ManageEngineが提供するOpManager

SNMPマネージャは、UDPのポート番号162を使用します。

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

監視されるのがSNMPエージェントです。

http://itdoc.hitachi.co.jp/manuals/3020/30203T0401/FIGURE/ZU010210.GIF
SNMPエージェントを構成するプロセス

http://otndnld.oracle.co.jp/document/products/E13161_01/tuxedo/docs10gr3/snmpadmin/wwimages/snmpadmin-01-1-3.gif
Oracle SNMP エージェントの概要

SNMPエージェントは、UDPのポート番号161を使用します。

f:id:ponsuke_tarou:20200318231214j:plain

SNMPv1、SNMPv2、SNMPv3の3つのバージョンがあります。

https://i2.wp.com/murci.net/wp-content/uploads/2018/12/snmp.png?resize=300%2C103&ssl=1
SNMPバージョンごとの違い – murci.net

SNMPv1とSNMPv2は、セキュリティが弱いのであまり使われていません。

以下の記事で取り上げているSNMPリフレクター攻撃では、SNMPv2に対応し、コミュニティ名(SNMPでのパスワード的なもの)が初期値の「public」に設定されている機器をターゲットにしていたそうです。
www.itmedia.co.jp

SNMPv3は、セキュリティが強化されてPDUの暗号化ができるのが特徴です。

SNMPv1とSNMPv2では、コミュニティ名による認証をしていました。

PDUは、制御情報をくっつけたデータの送受信単位のことです。

  • 英語 : Protocol Data Unit
  • 読み方 : ピーディーユー

転送フレームでのSNMPメッセージ
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu5.gif
GetRequest/GetNextRequest/SetRequest/GetResponseのPDU構造
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu6.gif
TrapのPDU構造
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu7.gif
どのようにしてネットワークを管理するのか?:監視を自動化するSNMP(2) - @IT

https://download.huawei.com/mdl/imgDownload?uuid=46e0b068cf634b4ea4154ec87161214f.png
What Is SNMP - Huawei

プロトコルによって呼び名は変わります。
プロトコル 呼び名
HTTP・TCP パケット
UDP・IP データグラム
イーサネット無線LAN フレーム
銀行とかのATM セル

出典 : PDU(プロトコルデータユニット)とは - IT用語辞典 e-Words

SNMPのPDUには種類があります。

名前 細かい名前 UDPタイプ 説明
ポーリング - - SNMPマネージャがSNMPエージェントにリクエストを送って情報を収集する
ポーリング GET REQUEST 0 一部の管理情報を取得する
ポーリング GETNEXT REQUEST 1 次に連続する管理情報を取得する
ポーリング GET RESPONSE 2 SNMPマネージャからの要求に対するSNMPエージェントの返答
ポーリング SET REQUEST 3 管理するサブシステムに対して変更を加える
トラップ - 4 SNMPエージェントがSNMPマネージャに障害の情報を送る

https://image.itmedia.co.jp/ait/articles/0303/21/r13zu1.gif
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu2.gif
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu3.gif
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu4.gif
どのようにしてネットワークを管理するのか?:監視を自動化するSNMP(2) - @IT

https://blogs.manageengine.jp/wp-content/uploads/2019/02/snmp_architecture.jpg
ネットワーク監視の超基本「SNMP」とは? « ManageEngine ブログ

https://download.huawei.com/mdl/imgDownload?uuid=085cf691cc3d49cd9150b8195dd9fec3.png
What Is SNMP - Huawei

事象の発生をエージェントが自発的にマネージャに知らせるために使用するのがトラップです。

図で示したネットワーク構成において,アプリケーションサーバA上のDBMSのデーモンが異常終了したという事象とその理由を,監視用サーバXで検知するのに有効な手段はどれか。
https://www.ap-siken.com/kakomon/24_haru/img/35.gif
答. アプリケーションサーバAから監視用サーバXへのSNMPトラップ
応用情報技術者平成24年春期 午前問35

SNMPマネージャとSNMPエージェントは、MIBをやり取りします。

http://atnetwork.info/tcpip2/tcpip25501.jpg
SNMPの仕組み(マネージャ/エージェント) TCP/IP入門

MIBは、機器の設定や状態などの情報集合体のことです。

  • 英語 : Management Information Base
  • 読み方 : みぶ
一つの要素が複数の子要素を持ち、階層が深くなるほど枝分かれしていく木構造です。

https://www.alaxala.com/jp/techinfo/archive/manual/AX2400S/HTML/11_7/CFGUIDE2/FIGURE/ZU209041.GIF
SNMP概説

https://download.huawei.com/mdl/imgDownload?uuid=51473c1c11b9497e9e163a64e6c03292.png
What Is SNMP - Huawei

MIBは、ASN.1という記法に従って定義されています。
  • 英語 : Abstract Syntax Notation One
  • 日本語 : 抽象構文記法1

ASN.1(Abstract Syntax Notation One = 抽象構文記法1)は、情報の構造定義の言語です。 通信プロトコルのフォーマットを規定するための言語で、 SNMPのMIBの記述、証明書:デジタル署名、LDAP,、Kerberos、TCなど多くのプロトコルで使用されています。
http://www5d.biglobe.ne.jp/stssk/asn1/index.html

SNMPエージェントは、MIBの内容で機器の状態を判断します。

サーバやネットワーク機器のMIB(Management Information Base)情報を分析し,中間者攻撃を遮断する。
応用情報技術者平成29年秋期 午前問38

f:id:ponsuke_tarou:20200313202707j:plain
北区の宝泉湯

次回の勉強内容

勉強中・・・

LANセグメントを分ける仮想LAN、VLANのお話

前回の勉強内容

ponsuke-tarou.hatenablog.com

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

VLAN機能をもった1台のレイヤ3スイッチに複数のPCを接続している。スイッチのポートをグループ化して複数のセグメントに分けると、スイッチのポートをセグメントを分けない場合に比べて、どのようなセキュリティ上の効果が得られるか。

  1. スイッチが、PCから送出されるICMPパケットを全て遮断するので、PC間のマルウェア感染のリスクを低減できる。
  2. スイッチが、PCからのブロードキャストパケットの到達範囲を制限するので、アドレス情報の不要な流出のリスクを低減できる。
  3. スイッチが、PCのMACアドレスから接続可否を判別するので、PCの不正接続のリスクを低減できる。
  4. スイッチが、物理ポートごとに、決まったIPアドレスをもつPCの接続だけを許可するので、PCの不正接続のリスクを低減できる。

情報処理安全確保支援士平成31年春期 午前Ⅱ 問12

VLANは、1つの物理的スイッチで複数のスイッチがあるみたいにLANセグメントを分けることができる技術です。

  • 正式名称 : Virtual Local Area Network(Virtual LAN)

VLANではない場合、1つの物理スイッチには1つのLANセグメントがあります。
VLANにすると、まるで複数のスイッチがあるように複数のLANセグメントに分割することができます。

https://www.infraexpert.com/studygif/vlanz1.gif
VLANとは

LANスイッチは、複数の機器をネットワークと接続できるようにする機器です。

OSI参照モデル 機器 説明
ネットワーク層 L3スイッチ ネットワークの中継機器の一つで、
ネットワーク層とリンク層の両方の制御情報に基づいてデータの転送先の決定を行います。
データリンク層 L2スイッチ MACアドレスを含んだ情報を使って
適切なポートにイーサネットフレームを転送します。

https://news.mynavi.jp/kikaku/switch-1/images/001.jpg
https://news.mynavi.jp/kikaku/switch-1/images/002.jpg
いまさら聞けないスイッチの基礎(1) LANスイッチとは? | マイナビニュース

スイッチ内に作られた仮想スイッチのポートを物理的なポートに割り当てることでLANセグメントを分割します。

VLAN対応スイッチでは、仮想的に作られたスイッチ、いわゆる仮想スイッチがスイッチ内部で動いている。スイッチの物理ポートを仮想スイッチのポートに割り当てることで、ネットワークの分割を実現している。
https://cdn-xtech.nikkei.com/atcl/nxt/column/18/00131/020600002/ph01.jpg?__scale=w:500,h:197&_sh=0c20a502a0
ポートVLANとタグVLANの違いとは? | 日経クロステック(xTECH)

ブロードキャストドメインを分割できるので、他のセグメントへのARPを防止します。

https://milestone-of-se.nesuke.com/wp-content/uploads/2016/12/VLAN3.png
【図解】初心者にも分かる VLAN 入門〜仕組み,メリットや必要性について〜│SEの道標

ARPは、IPアドレスからMACアドレスを取得するために使われるプロトコルです。

ponsuke-tarou.hatenablog.com

スイッチが、PCからのブロードキャストパケットの到達範囲を制限するので、アドレス情報の不要な流出のリスクを低減できます。

https://www.sc-siken.com/kakomon/31_haru/img/12.gif
情報処理安全確保支援士平成31年春期 午前Ⅱ 問12

L3スイッチの内部ルーターを使うことで分割したLANセグメント同士を接続することができます。

L3スイッチは、L2スイッチの内部にルーターの機能を組込んでルーターによるVLAN間ルーティングをするネットワーク機器です。

https://news.mynavi.jp/article/vlan-4/images/002.jpg
今さら聞けない「VLANの基本」(4) VLAN間ルーティング | マイナビニュース

各VLANを識別するために割り振られる番号をVLAN IDといいます。

https://tomslifestylelab.com/wp-content/uploads/2019/02/vlanope6.png
【Catalystスイッチ】VLANの設定方法はこれでOK! |

同じVLAN IDに所属する機器は同じVLANに所属して通信できます。

https://www.infraexpert.com/studygif/vlanz7.gif
VLAN - アクセスポートとトランクポート

VLAN IDの「0」と「4095」は予約済みの番号です。
VLAN ID 用途
0 VLANにも属していないフレームであることを表す特殊なID
4095 システム用

VLANは、LANセグメントの分割方法によって方式があります。

名前 概要
デフォルトVLAN(VLAN1) L2スイッチの初期状態で、1だけが設定されているVLANです。
VLAN1だけなのでLANセグメントは分割されず1つだけです。
プライベートVLAN 同一VLAN内でのアクセス制御が可能なVLANです。
ダイナミックVLAN スイッチに接続する機器のMACアドレスやユーザー情報によって自動で割り当てるVLANを決めます。
ポートベースVLAN スイッチにの差込口(ポート)でLANセグメントを分割します。
タグVLAN フレームにタグをつけてVLANを見分けます。

ポートベースVLANは、複数のポートを論理的なグループにまとめグループ内だけの通信を可能にします。

  • 別名 : ポートVLAN、スタティックVLAN

ポートベースVLAN
スイッチの接続ポート単位でグルーピング
ソフトウェア開発技術者平成18年秋期 午前問59

https://news.mynavi.jp/article/vlan-2/images/003.jpg
今さら聞けない「VLANの基本」(2) ポートベースVLANとは | マイナビニュース

物理的なポートごとにLANセグメントを分割するので、1つのポートにつけられるVLAN IDは1つです。

https://cdn-xtech.nikkei.com/atcl/nxt/column/18/00131/020600002/ph02.jpg?__scale=w:500,h:238&_sh=0c40f00df0
ポートVLANとタグVLANの違いとは? | 日経クロステック(xTECH)

タグVLANは、イーサネットフレームにタグ情報を挿入してフレーム単位でLANセグメントを分割します。

イーサネットフレームのタグで判別するので、1つのポートに複数のVLAN IDをつけられます。

タグVLAN (Tag VLAN) とは、複数のVLANを1本のLAN 接続だけで複数スイッチ間で共有できる技術です。IEEE802.1qという規格で規定されており、VLAN IDは1~4094が使えます。
https://milestone-of-se.nesuke.com/wp-content/uploads/2017/10/tag-vlan-1.png
【図解】タグVLANとネイティブVLAN (PVID)の違い,native vlanを変更する理由,不一致による影響│SEの道標

イーサネットフレームは、イーサネットでの通信で使用するデータフォーマットのことです。

ponsuke-tarou.hatenablog.com

タグのフォーマットは、IEEE802.1Qで標準化されています。
  • 通称 : ドット1キュー

https://www.n-study.com/grafic/newvlan12.gif
IEEE802.1QとISL | ネットワークのおべんきょしませんか?

EEE802.1Qでは送信元MACアドレスとタイプフィールドの間にタグと呼ばれる4バイトのフィールドを挿入します。
https://www.infraexpert.com/studygif/vlanz10.gif
VLAN - アクセスポートとトランクポート

複数のVLANに所属しているポートをトランクポートといいます。

https://www.sc-siken.com/kakomon/30_haru/img/19.gif
情報処理安全確保支援士平成30年春期 午前Ⅱ 問19

トランクポートは複数のVLANに所属するポートです。主にスイッチ同士を接続する際に使用するポートです。
https://www.infraexpert.com/studygif/vlanz9.gif
VLAN - アクセスポートとトランクポート

タグVLANで使う物理ポートをトランクポート、トランクポート同士をつなぐリンクを「トランクリンク」と呼ぶ。トランクポートには通常、パソコンなどの端末を接続せず、スイッチのトランクポート同士をつなぐために使う。
https://cdn-xtech.nikkei.com/atcl/nxt/column/18/00131/020600002/ph04.jpg?__scale=w:500,h:253&_sh=0b70bf0750
ポートVLANとタグVLANの違いとは? | 日経クロステック(xTECH)

f:id:ponsuke_tarou:20161230114147j:plain
いつか見た景色

次回の勉強内容

勉強中・・・

RDSでOracleを作ってみる

RDSでMySQLをつくってみました。

Oracleでもやりたいことができたので作ってみます。
ponsuke-tarou.hatenablog.com

EC2インスタンスから使えるRDSを作成します。

RDS作成予定のVPC内にある以前作成したEC2インスタンスから接続します。
ponsuke-tarou.hatenablog.com
f:id:ponsuke_tarou:20200311084258j:plain

RDSでOracleを作成してみます。

  1. AWS マネジメントコンソールで[RDS]を選択して、RDSの画面を表示します。
  2. [データベースの作成]ボタンで[データベースの作成]画面を表示します。
  3. 以下を設定して[データベースの作成]ボタン
    • データベース作成方法を選択 : 標準作成
    • エンジンのオプション
      • エンジンのタイプ : Oracle
      • エディション : Oracle Standard Edition Two
      • バージョン : Oracle12.2.0.1.ru-2020-01.rur-2020-01.r1(お好みのバージョンを選択でOK)
      • ライセンス : license-included
    • テンプレート : 開発/テスト
    • 設定
      • DB インスタンス識別子 : oracle-12(お好みの名前でOK)
      • マスターユーザー名 : admin(お好みの名前でOK)
      • パスワードの自動生成 : ON
    • DB インスタンスサイズ
    • 接続
      • Virtual Private Cloud (VPC) : 接続予定のEC2と同じVPC
      • パブリックアクセス可能 : なし
    • 追加設定
      • 最初のデータベース名 : ponsukedb
      • 削除保護の有効化 : ON
    • 上記以外の設定値は規定値のまま
  4. 画面上部に表示される[認証情報の詳細を表示]ボタンでパスワードを確認してどっかに記録しておきます。
    • f:id:ponsuke_tarou:20200303224505p:plain
      パスワードを表示できるのはこのときだけです。

EC2インスタンスから接続できるようにセキュリティグループを設定します。

今回はRDSとEC2が同じVPC内にある構成なので、RDSのセキュリティグループに

  1. EC2のプライベートIP
  2. EC2のセキュリティグループID(sg-xxxx)

のどちらかをOracle用ポート(1521)に許可するように設定します。
MySQLを作成したときは、プライベートIPを設定したので
今回は、セキュリティグループIDを設定してみます。

セキュリティグループにEC2インスタンスのセキュリティグループIDを設定します。

EC2インスタンスのセキュリティグループIDを確認します。
  1. AWS マネジメントコンソールで[EC2]を選択して、EC2の画面を表示します。
  2. [インスタンス] > 対象のEC2インスタンスを選択 > 下の詳細画面を表示します。
  3. [セキュリティグループ]に表示されているリンクからセキュリティグループの画面を表示します。
  4. 一覧の[Security group ID]に表示されているセキュリティグループIDをメモします。
セキュリティグループを設定します。
  1. AWS マネジメントコンソールで[RDS]を選択して、RDSの画面を表示します。
  2. サイドメニューにある[データベース]リンクでデータベースの一覧を表示して、対象のRDSのDB 識別子リンクから詳細画面を表示します。
  3. VPC セキュリティグループのリンクからセキュリティグループの詳細画面を表示します。
    • f:id:ponsuke_tarou:20200219201158p:plain
  4. [Inbound rules]タブにある[Edit inbound rules]ボタンから編集画面を表示します。
  5. [Add rule]ボタンで行を追加して、以下を設定します。
  6. [Save rules]ボタンで保存します。

RDSへSQL*Plusで接続してみます。

EC2インスタンスにSQLPlusをインストールします。

ponsuke-tarou.hatenablog.com

(停止していたら)RDSを起動します。

  1. データベースの一覧で作成したRDSを選択します。
  2. [アクション] > [開始]で起動します(少々時間がかかります)。
  3. 一覧の[ステータス]が「利用可能」になったら起動しています。

エンドポイントを確認します。

  1. データベース一覧から作成したDB 識別子のリンクから詳細画面を開きます。
  2. [接続とセキュリティ]タブ > [エンドポイント]に表示されている「{DB識別子}.xxxxx.{リージョン}.rds.amazonaws.com」がエンドポイントで接続情報となります。

Oracleにログインできました。

$ sqlplus64 admin/password@oracle-12.hoge.us-east-2.rds.amazonaws.com:1521/pondb

SQL*Plus: Release 12.2.0.1.0 Production on 火 310 11:45:48 2020

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

最終正常ログイン時間: 火 310 2020 11:17:11 +00:00


Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
SQL>
ユーザーを作成して好きに使っていきます。

ponsuke-tarou.hatenablog.com

自動停止するように自動停止時間をAutoStopタグに設定します。

MySQLのRDSを作ったときに設定したRDS自動停止用のLambdaで自動停止できるようにAutoStopタグを設定します。
ponsuke-tarou.hatenablog.com

  1. データベース一覧から作成したDB 識別子のリンクから詳細画面を開きます。
  2. [タグ]タブ > [追加]ボタンで[タグの追加] ウィンドウを表示します。
  3. [タグキー]に「AutoStop」と[値]に「自動停止したい時間」を入力して[追加]ボタンでタグを追加します。

失敗したこと

DBName must be less than 8 characters long.

f:id:ponsuke_tarou:20200303224225p:plain

ORA-12514: TNS:listener does not currently know of service requested in connect

qiita.com

f:id:ponsuke_tarou:20200229152733j:plain
北区の平和湯

EC2インスタンスのDockerコンテナにあるRedmineとGitHubを連携してみた記録

GitHubと連携するプラグインRedmineに追加します。

github.com

プラグインを配置します。

# 1. DockerホストにログインしてDockerを動かせるユーザーに切り替えます。
$ sudo su - {Docker用ユーザー}
[sudo] ponsuke のパスワード:
最終ログイン: 2019/09/04 () 18:53:50 JST日時 pts/0

# 2. Redmineコンテナが起動していることを確認します。
$ cd docker/host/
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e943461bd3ad        redmine:4.0.4       "/docker-entrypoint.…"   7 months ago        Up 6 days           0.0.0.0:80->3000/tcp   redmine_no_container

# 3. DockerホストからRedmineコンテナのプラグイン用ディレクトリににプラグインをクローンします。
$ docker exec redmine_no_container git clone https://github.com/koppen/redmine_github_hook.git /path/to/redmine/plugins/redmine_github_hook
Cloning into '/path/to/redmine/plugins/redmine_github_hook'...

# 4. Redmineコンテナにログインします。
$ docker exec -it redmine_no_container bash

# 5. プラグイン用ディレクトリに移動してクローン出来たことを確認します。
$ cd /path/to/redmine/plugins/redmine_github_hook/
$ ls -la | grep github
-rw-r--r-- 1 root    root     876 Feb 28 08:57 redmine_github_hook.gemspec

# 6. Redmineコンテナからログアウトします。
$ exit

# 7. Redmineコンテナを再起動します。
$ docker restart redmine_no_container
redmine_no_container

Redmineプラグインが追加されたことを確認します。

  1. Redmineにログインします。
  2. [管理] > [プラグイン]で画面を表示してプラグインが追加されたことを確認します。
    • f:id:ponsuke_tarou:20200306080734p:plain

GitHubリポジトリにDeploy keysを登録してパスワードなしでクローンできるようにします。

codelab.website

コンテナで秘密鍵と公開鍵を作成します。

鍵を作成する際にパスフレーズを設定するとリポジトリをクローンだけでなくフェッチするときにも毎回パスフレーズの入力が必要になってしまうため、今回パスフレーズは設定しません。
※. パスフレーズの設定および解除は自己責任で実施してください。

# 1. DockerホストにログインしてDockerを動かせるユーザーに切り替えます。
$ sudo su - {Docker用ユーザー}
[sudo] ponsuke のパスワード:
最終ログイン: 2020/02/28 () 17:22:13 JST日時 pts/0

# 2. Redmineコンテナにログインします。
$ cd docker/host/
$ docker exec -it redmine_no_container bash

# 3. RSA鍵のペアを作成します。
# ssh-keygenコマンドはデフォルトで「ユーザー名@ホスト名」をコメントにします。なのでGitHubのユーザのメールアドレスをコメントとして-Cオプションで指定します。
$ ssh-keygen -t rsa -C ponsuke@mail.com
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <<<< Enter
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): <<<< Enter
Enter same passphrase again: <<<< Enter
...省略...

# 4. 公開鍵を表示してコピーします。
$ cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAA...
#

GitHubリポジトリのDeploy keysに公開鍵を登録します。

  1. GitHubにログインします。
  2. クローンするリポジトリ > [Settings]タブ > [Deploy key] > [Add deploy key]ボタン
    • f:id:ponsuke_tarou:20200306083615p:plain
  3. タイトルをつけてコピーした公開鍵を登録します。
    • [Allow write access]はOFFで登録します。

GitHub上のソースをクローンします。

# 1. リポジトリのクローン先用にディレクトリを作成します。
$ mkdir git
$ ls -la | grep git
drwxrwxr-x  2 redmine redmine   38 Jun 10  2019 .github
-rw-rw-r--  1 redmine redmine  761 Jun 10  2019 .gitignore
drwxr-xr-x  2 root    root       6 Mar  5 23:55 git

# 2. 作成したディレクトリに移動します。
$ cd git/

# 3. ベアリポジトリをクローンします。
$ git clone --bare git@github.com:ponta/hoge.git
Cloning into bare repository 'hoge.git'...
Warning: Permanently added the RSA host key for IP address '12.345.67.89' to the list of known hosts.
Enter passphrase for key '/root/.ssh/id_rsa':
remote: Enumerating objects: 311, done.
remote: Counting objects: 100% (311/311), done.
remote: Compressing objects: 100% (191/191), done.
remote: Total 19981 (delta 110), reused 232 (delta 42), pack-reused 19670
Receiving objects: 100% (19981/19981), 11.54 MiB | 7.12 MiB/s, done.
Resolving deltas: 100% (12399/12399), done.
$

Redmineを設定します。

  1. Redmineにログインします。
  2. 連携するプロジェクトを選択します。

リポジトリを設定します。

https://codelab.website/wp-content/uploads/2018/05/32e0dd9eb81c1b9af2fe6fc5fdcd1138.png
RedmineとGitHubを連携する | CodeLab

  1. [設定] > [リポジトリ]タブ > [新しいリポジトリ]
  2. 新しいリポジトリ画面で以下を設定して[作成]ボタンで作成します。

チケットとリビジョンを関連付けられるように設定します。

http://redmine.jp/images/tech_note/link-issue-to-rev.png
バージョン管理システムとの連携 — Redmine.JP

http://redmine.jp/images/faq/relations_without_keywords.png
参照用キーワード(refsなど)無しでリビジョンとチケットを関連づける — Redmine.JP

  1. [管理] > [設定] > [リポジトリ]タブ
  2. [参照用キーワード]に「*」を追記して[保存]ボタンで保存します。

Redmine上にクローンしたベアリポジトリを更新します。

www.axlight.com

# 1. DockerホストにログインしてDockerを動かせるユーザーに切り替えます。
$ sudo su - {Docker用ユーザー}
[sudo] ponsuke のパスワード:
最終ログイン: 2019/09/04 () 18:53:50 JST日時 pts/0

# 2. Redmineコンテナにログインします。
$ docker exec -it redmine_no_container bash

# 3. リポジトリのクローン先に移動します。
$ cd git/hoge.git

# 4. ベアリポジトリを更新します。
$ git fetch origin 'refs/heads/*:refs/heads/*'
チケットに関連付くコミットがあるとチケットに表示されます。

f:id:ponsuke_tarou:20200311143718p:plain

GitHubにWebhookの設定を行います

https://codelab.website/wp-content/uploads/2018/05/c421aa39afa9bc8b49550ae6afd8ecde.png
RedmineとGitHubを連携する | CodeLab

  1. GitHubにログインします。
  2. クローンするリポジトリ > [Settings]タブ > [Webhooks] > [Add webhook]ボタンで入力画面を表示します。
  3. 以下を入力して[Add webhook]ボタンで追加します。
    • Payload URL : https://{RedmineのURL}/githook?project_id={RedmineのプロジェクトID}
    • Content type : application/x-www-form-urlencoded
    • Enable SSL verification : ON
    • Just the push event : ON
    • Active : ON

失敗したこと

認証用の鍵にパスフレーズを設定して毎回入力が必要になってしまった。

GitHubの認証用の鍵を作成した際にパスフレーズを設定しました。
その結果、フェッチのたびにパスフレーズの入力が必要となってしまいました。
そうすると自動でフェッチさせるのに困ります。なのでパスフレーズを解除します。
※. パスフレーズを解除するのは自己責任で実施してください。

対応 : (失敗)パスフレーズを解除できなかった。

コンテナにsudoコマンドがなくてうまくできませんでした。

$ cd /root/.ssh/

# バックアップします
$ cp id_rsa id_rsa.org
$ ls -la | grep id_rsa
-rw------- 1 root root 1876 Mar  5 23:28 id_rsa
-rw------- 1 root root 1876 Mar 15 23:39 id_rsa.org
-rw-r--r-- 1 root root  408 Mar  5 23:28 id_rsa.pub

# パスフレーズを解除しますが、パスフレーズを入力するはずが・・・エラーに・・・
$ openssl rsa -in id_rsa -out id_rsa
unable to load Private Key
14068536:error:0909006C:PEM routines:get_name:no start line:../crypto/pem/pem_lib.c:745:Expecting: ANY PRIVATE KEY

# パスフレーズをコマンドと合わせて入力してもエラーに・・・
$ openssl rsa -in id_rsa -passin pass:othelve2020 -out id_rsa
unable to load Private Key
14068576:error:0909006C:PEM routines:get_name:no start line:../crypto/pem/pem_lib.c:745:Expecting: ANY PRIVATE KEY

# コンテナには必要最低限のコマンドしかないためsudoすらなかった・・・(そもそもログインユーザーがrootなので意味ないかも)
$ sudo openssl rsa -in id_rsa -out id_rsa
bash: sudo: command not found
対応 : 認証鍵を作り直します。
  1. 認証鍵をパスフレーズなしで再作成します。
  2. GitHubリポジトリのDeploy keysに公開鍵を再登録します。
# 認証鍵をパスフレーズなしで再作成します。
$ ssh-keygen -t rsa -C ponsuke@mail.com
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <<<< Enter
Enter passphrase (empty for no passphrase): <<<< Enter
Enter same passphrase again: <<<< Enter
...省略...

# 公開鍵を表示してコピーして再登録します。
$ cat id_rsa.pub
ssh-rsa AAAAAAA...省略...

(未解決)We couldn’t deliver this payload: Failure when receiving data from the peer

f:id:ponsuke_tarou:20200310181632p:plain

  • 事象 : GitHubに設定したWebhookでエラーになっている
    1. GitHubにログイン > クローンするリポジトリ > [Settings]タブ > [Webhooks]
    2. 設定したWebhookに赤い三角マークが表示されているのでリンクをクリック
    3. [Recent Deliveries]のエラーをクリックするとエラーメッセージと共にPayloadが表示されている
  • 原因 : 不明

UbuntuにSQL*Plusをインストールする方法

以前、Windows10にSQL*Plusをインストールしました。

ponsuke-tarou.hatenablog.com
RDSのOracleにEC2のUbuntuからSQL*Plusを使って接続したいと思います。
なので今回は、EC2のUbuntuSQL*Plusをインストールしたいと思います。

rpmをダウンロードします。

インスタンスタイプが小さく動きが悪いのでダウンロードだけリモートデスクトップ接続で行い、あとはSSH接続してコマンドで実施します。

  1. リモートデスクトップ用ユーザーでUbuntuリモートデスクトップ接続してブラウザを起動します。
  2. Oracleのサイトからからパッケージをダウンロードします。

Alienコマンドでrpmパッケージをdebパッケージに変換します。

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

Ubuntuは、Debian GNU/Linuxをベースとしたオペレーティングシステムです。
Debianでは、debパッケージでソフトウエアをインストールします。
Alienは、rpmdebパッケージに変換してくれるプログラムです。

# 1. SSHでUbuntuに接続します。
$ ssh -i .ssh/秘密鍵.pem ubuntu@xx.xx.xx.xx
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-1060-aws x86_64)

 * Documentation:  https://help.ubuntu.com
# ...省略...
Last login: Fri Mar  6 12:27:00 2020 from 153.242.66.11

# 2. aptでAlienを検索します。
$ apt search alien
Sorting... Done
Full Text Search... Done
alien/bionic 8.95 all # <<<<< これをインストールします。
  convert and install rpm and other packages

alien-arena/bionic 7.66+dfsg-4 amd64
  Standalone 3D first person online deathmatch shooter
# ...省略...

# 3. Alienをインストールします。
$ sudo apt -y install alien
Reading package lists... Done
Building dependency tree       
Reading state information... Done
# ...省略...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...

# 4. インストールされたことの確認にバージョンを確認します。
$ alien --version
alien version 8.95

rpmパッケージをdebパッケージに変換します。

xtech.nikkei.com

# 1. rpmのダウンロード先であるリモートデスクトップのユーザーのDownloadsディレクトリに移動します。
$ cd /home/ponsuke/Downloads/

$ ls -la | grep rpm
-rw-rw-r--  1 ponsuke ponsuke 26731248 Mar  6 21:42 oracle-instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm
-rw-rw-r--  1 ponsuke ponsuke   708104 Mar  6 21:44 oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm

# 2. rpmパッケージをdebパッケージに変換します。
$ sudo alien -c oracle-instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm 
oracle-instantclient12.2-basiclite_12.2.0.1.0-2_amd64.deb generated
# -cオプション : パッケージのインストール時・アンインストール時に実行されるスクリプトも変換する
$ sudo alien -c oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm 
oracle-instantclient12.2-sqlplus_12.2.0.1.0-2_amd64.deb generated

SQL*Plusをインストールします。

dpkgコマンドでインストールします。

「dpkg」とはdebianのパッケージである「deb」ファイルを取り扱うコマンドである。名前の由来は「Debian Package」の略とされている。
Debianのパッケージ管理システムは他のディストリビューションに比べて最も高度な部類だ。
dpkg単体でもパッケージのインストールやアンインストールは一応に可能だが、実際にはパッケージの操作及び統合管理は「apt」系のコマンド「apt-get」や「aptitude」などで行なわれる。これにより依存関係の解決が行われ、必要なパッケージが自動的に導入される。
debファイルを扱うdpkgコマンドの使い方を簡単解説

# 1. dpkgコマンドでインストールします。
$ sudo dpkg -i oracle-instantclient12.2-basiclite_12.2.0.1.0-2_amd64.deb oracle-instantclient12.2-sqlplus_12.2.0.1.0-2_amd64.deb 
Selecting previously unselected package oracle-instantclient12.2-basiclite.
(Reading database ... 157738 files and directories currently installed.)
Preparing to unpack oracle-instantclient12.2-basiclite_12.2.0.1.0-2_amd64.deb ...
Unpacking oracle-instantclient12.2-basiclite (12.2.0.1.0-2) ...
Selecting previously unselected package oracle-instantclient12.2-sqlplus.
Preparing to unpack oracle-instantclient12.2-sqlplus_12.2.0.1.0-2_amd64.deb ...
Unpacking oracle-instantclient12.2-sqlplus (12.2.0.1.0-2) ...
Setting up oracle-instantclient12.2-basiclite (12.2.0.1.0-2) ...
Setting up oracle-instantclient12.2-sqlplus (12.2.0.1.0-2) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...

# 2. イントールされたことを確認します。
$ which sqlplus64
/usr/bin/sqlplus64

SQL*Plus用の環境変数を.profileに設定します。

# 1. ログインユーザーのホームディレクトリに戻ります。
$ cd ~
$ ls -la | grep profile
-rw-r--r-- 1 ubuntu ubuntu  807 Apr  4  2018 .profile

# 2. インストール先を確認します。
$ find /usr/lib/oracle/12.2/client64/ -type d
/usr/lib/oracle/12.2/client64/
/usr/lib/oracle/12.2/client64/lib
/usr/lib/oracle/12.2/client64/bin

# 3. SQL*Plus用の環境変数を.profileに設定します。
$ vi .profile 
# ↓ここから追記するところ
# SQL*Plusのインストール場所を指定する環境変数。
export ORACLE_HOME=/usr/lib/oracle/12.2/client64
# UNIXおよびLinux上のライブラリの検索に使用するパスを指定する環境変数。
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
# グローバリゼーション機能を指定する環境変数。
export NLS_LANG=Japanese_Japan.UTF8

export PATH=$ORACLE_HOME/bin:$PATH
# ↑ここまで追記するところ

# 4. 環境変数を反映します。
$ source .profile 

# 5. 環境変数を確認します。
$ printenv | grep -i oracle
LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib:
ORACLE_HOME=/usr/lib/oracle/12.2/client64
PATH=/usr/lib/oracle/12.2/client64/bin:...省略...

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

# 起動しました。
$ sqlplus64

SQL*Plus: Release 12.2.0.1.0 Production on 月 39 14:17:17 2020

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

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

失敗したこと

i386.rpm is for architecture i386 ; the package cannot be built on this system

qiita.com

sqlplus: command not found

qiita.com


f:id:ponsuke_tarou:20161113101208j:plain

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

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

slack.com

アプリをインストールします。

  1. Slack + GitHub のページを開いて、[Add to Slack]ボタンを押下します。
  2. 設定したいSlackのワークスペースになっていることを確認して[Continue]ボタンで進みます。
  3. [All public channels]を選択して[Install]ボタンでインストールします。
  4. ワークスペースGitHubアプリが追加されます。
    • f:id:ponsuke_tarou:20200304085215p:plain

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

  1. GitHubアプリに向けて「/github signin」を送信して、表示された[Connect GitHub account]ボタンでWeb画面を表示します。
  2. [Authorize Slack by GitHub]ボタンで連携します。

f:id:ponsuke_tarou:20200304085941p:plain
今回は2段階認証をしているので上記のような画面でしたが、2段階認証をしていないと以下のサイトの画像のようになるかもしれません。

https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F6380%2F7e0dc57c-1633-0832-94a1-8ba717ab3999.jpeg?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=9bf2dd9568c9294fd4f34c184c36fb31
SlackとGitHubを連携してissueコメントやプルリク通知をチャンネルに流す方法(2020年版) - Qiita

通知したいチャネルを設定します。

  1. 「/invite @GitHub」を送信して[Allow]ボタンでGitHubアプリをチャネルに追加します。
    • f:id:ponsuke_tarou:20200304091022p:plain
  2. 「/github subscribe オーナー名/リポジトリ」で通知の受信を開始します。

失敗したこと

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

f:id:ponsuke_tarou:20200304091921p:plain

  • 事象 : 通知したいチャネルで「/github subscribe」したら怒られた
  • 原因 : GitHub 側で Slack アプリがインストールされていないから
  • 対応
    1. メッセージに表示された[Install GitHub App]ボタンでWeb画面を開きます。
    2. 連携するGitHubのオーナーを選択します。
      • f:id:ponsuke_tarou:20200304102755p:plain
    3. [Only select repositories]で通知したいリポジトリを選択します(複数選択可)。
    4. [Install]ボタンでインストールしてパスワードを求められたら入力します。
    5. もう一度チャネルで「/github subscribe ~」をします。

Ubuntuにmysqlコマンドをインストールする

RDSに接続するために使いたいのでMySQLサーバーはインストールしません。

RDSにつくったMySQLに接続するのでmysqlコマンドがほしいのです。
ponsuke-tarou.hatenablog.com

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

Ubuntuでは、パッケージ管理にyumではなくaptを使用するようなのでaptを使ってインストールします。
linuxfan.info

リポジトリ一覧を更新します。

注記
入手可能な最新バージョンを確実にダウンロードするために、インストールの前に apt-get インデックスファイルを更新してください。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 2.5.7 ネイティブソフトウェアリポジトリから MySQL を Linux にインストールする

$ sudo apt update
Hit:1 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic InRelease
Hit:2 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:3 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic-backports InRelease
Hit:4 http://security.ubuntu.com/ubuntu bionic-security InRelease              
Reading package lists... Done                                                  
Building dependency tree       
Reading state information... Done
29 packages can be upgraded. Run 'apt list --upgradable' to see them.

mysql-clientのパッケージを検索します。

$ apt search mysql-client
Sorting... Done
Full Text Search... Done
default-mysql-client/bionic 1.0.4 all
  MySQL database client binaries (metapackage)

default-mysql-client-core/bionic 1.0.4 all
  MySQL database core client binaries (metapackage)

mysql-client/bionic-updates,bionic-security 5.7.29-0ubuntu0.18.04.1 all
  MySQL database client (metapackage depending on the latest version)

mysql-client-5.7/bionic-updates,bionic-security 5.7.29-0ubuntu0.18.04.1 amd64
  MySQL database client binaries

mysql-client-core-5.7/bionic-updates,bionic-security 5.7.29-0ubuntu0.18.04.1 amd64
  MySQL database core client binaries

mysql-client-coreをインストールします。

mysqlコマンドがほしいだけなのでコンパクトな「mysql-client-core-5.7」をインストールします。
参考 : mysql-clientとmysql-client-coreの違いは何ですか? - 初心者向けチュートリアル

$ sudo apt install mysql-client-core-5.7
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libaio1
The following NEW packages will be installed:
  libaio1 mysql-client-core-5.7
0 upgraded, 2 newly installed, 0 to remove and 29 not upgraded.
Need to get 6648 kB of archives.
After this operation, 30.5 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libaio1 amd64 0.3.110-5ubuntu0.1 [6476 B]
Get:2 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 mysql-client-core-5.7 amd64 5.7.29-0ubuntu0.18.04.1 [6642 kB]
Fetched 6648 kB in 0s (46.6 MB/s)           
Selecting previously unselected package libaio1:amd64.
(Reading database ... 85356 files and directories currently installed.)
Preparing to unpack .../libaio1_0.3.110-5ubuntu0.1_amd64.deb ...
Unpacking libaio1:amd64 (0.3.110-5ubuntu0.1) ...
Selecting previously unselected package mysql-client-core-5.7.
Preparing to unpack .../mysql-client-core-5.7_5.7.29-0ubuntu0.18.04.1_amd64.deb ...
Unpacking mysql-client-core-5.7 (5.7.29-0ubuntu0.18.04.1) ...
Setting up libaio1:amd64 (0.3.110-5ubuntu0.1) ...
Setting up mysql-client-core-5.7 (5.7.29-0ubuntu0.18.04.1) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...

# mysqlコマンドがインストールできたことを確認するためにバージョンを確認します。
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using  EditLine wrapper

RDSのMySqlに接続してみます。

f:id:ponsuke_tarou:20200229081624j:plain
構成

RDSのセキュリティグループを設定します。

今回はRDSとEC2が同じVPC内にある構成なので、RDSのセキュリティグループに

  1. EC2のプライベートIP
  2. EC2のセキュリティグループID(sg-xxxx)

のどちらかをMySQL用ポート(3306)に許可するように設定します。

セキュリティグループにUbuntuのプライベートIPを設定します。
  1. Ubuntu(EC2インスタンス)の[プライベートIP]を確認しておきます。
  2. AWS マネジメントコンソールで[RDS]を選択して、RDSの画面を表示します。
  3. サイドメニューにある[データベース]リンクでデータベースの一覧を表示して、対象のRDSのDB 識別子リンクから詳細画面を表示します。
  4. VPC セキュリティグループのリンクからセキュリティグループの詳細画面を表示します。
    • f:id:ponsuke_tarou:20200219201158p:plain
  5. [インバウンド]タブにある[編集]ボタンからダイアログを表示します。
  6. [ルールの追加]ボタンで行を追加して、以下を設定します。

mysqlコマンドでログインします。

$ mysql -h mysql-57.xxx.{リージョン}.rds.amazonaws.com -P 3306 -u admin -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.28-log Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

失敗したこと

E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)

  • 事象 : apt updateしたら怒られた
  • 原因 : 実行権限がないから
  • 対応 : rootに切り替えるかsudoで実行する
# 失敗
$ apt update
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)

# 対応後
$ sudo apt update
Hit:1 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic InRelease
Hit:2 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:3 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic-backports InRelease
Hit:4 http://security.ubuntu.com/ubuntu bionic-security InRelease              
Reading package lists... Done                                                  
Building dependency tree       
Reading state information... Done
29 packages can be upgraded. Run 'apt list --upgradable' to see them.

ERROR 2003 (HY000): Can't connect to MySQL server on

  • 事象 : mysqlコマンドでRDSにログインできない。
  • 原因 : RDSにEC2からの接続が許可されていないから
  • 対応 : RDSのセキュリティグループを設定する
$ mysql -h mysql-57.xxx.{リージョン}.rds.amazonaws.com -P 3306 -u admin -p
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on 'mysql-57.xxx.{リージョン}.rds.amazonaws.com' (110)

f:id:ponsuke_tarou:20200227214236j:plain
坂田城跡 天空の梅まつり