Nmap(Network Mapper)
Nmapとは
ポートスキャンを行えるツール。
私はポートが開放されているかどうかくらいでしか、使用したことがなかったので改めて使い方を調べる。
※ポートスキャンは不正アクセス禁止法には抵触しませんが、「攻撃された」と判断する可能性もあるので自分の保有していないものに関しては実行しないほうが懸命です。
自宅のRassberry pi へとnmapを実行してみました。
ホスト名ではなく、IPアドレスでも実行可能です。
$ nmap 192.168.11.1 Starting Nmap 7.70 ( https://nmap.org ) at 2021-08-20 17:19 JST Nmap scan report for 192.168.11.1 Host is up (0.0064s latency). Not shown: 996 closed ports PORT STATE SERVICE 53/tcp open domain 80/tcp open http 443/tcp open https 49152/tcp open unknown MAC Address: 60:84:BD:F6:39:18 (Unknown) Nmap done: 1 IP address (1 host up) scanned in 1.75 seconds
このように開放されているポートが確認できました。
STATEについては以下の表通りです。
state | description |
---|---|
open | ポートが開放されている |
closed | ポートが閉じている |
filtered | フィルタ処理されていて確認できない |
unfiltered | ポートへのアクセス可能、しかし、open closeを確認できない |
TCP SYNスキャン
SYNパケットを送信し、ポートにアクセス可能な場合、SYN/ACKパケットを返します。
$ nmap --packet-trace -sS 192.168.11.1
Nmap Script
nmapには現状で604個のscriptが用意されています。上記のサイトでカテゴリ毎にscriptが用意されています。
これらのscriptはNSE(Nmap Scripting Engine)上で動くLuaで書かれてたscriptです。
sctipt1つ実行することもできますし、カテゴリ指定でscript群を実行することもできます。
今回は様々な脆弱性を検出できるVlunカテゴリを実行してみました。
$ nmap --script vuln 192.168.11.1 Starting Nmap 7.70 ( https://nmap.org ) at 2021-08-20 17:37 JST Nmap scan report for 192.168.11.1 Host is up (0.0052s latency). Not shown: 996 closed ports PORT STATE SERVICE 53/tcp open domain 80/tcp open http |_http-csrf: Couldn't find any CSRF vulnerabilities. |_http-dombased-xss: Couldn't find any DOM based XSS. |_http-stored-xss: Couldn't find any stored XSS vulnerabilities. 443/tcp open https |_http-csrf: Couldn't find any CSRF vulnerabilities. |_http-dombased-xss: Couldn't find any DOM based XSS. |_http-stored-xss: Couldn't find any stored XSS vulnerabilities. |_ssl-ccs-injection: No reply from server (TIMEOUT) |_sslv2-drown: 49152/tcp open unknown MAC Address: 60:84:BD:F6:39:18 (Unknown) Nmap done: 1 IP address (1 host up) scanned in 103.09 seconds
nginxを入れただけのラズパイなので脆弱性は検出されずです。
MySQLを立てて外部からのアクセスが可能にしている場合は mysql-brute 等のscriptを使ってみて検証してもいいかもしれません。
今後、何かに使えそうと思ったのでメモメモ
Golangでopenweathermapを使ってみる
天気予報の個人使用無料のAPIを使ってみたかったので作成。
気象庁が公開している非公式のAPIもありますが、1時間毎のデータを取得できる等のメリットがあるopenweathermapを使用。
FreePlanでアカウントを作成してマイページからAPP_IDをコピペしてリクエストできます。
APP_IDが発行されたばかりではリクエストできず401が帰ってきます。数時間立てばリクエストできるようになります。
試しに東京の天気を取得します。
curl "https://api.openweathermap.org/data/2.5/onecall?lat=35.681236&lon=139.767125&units=metric&lang=ja&appid=#{appId}"
{ "lat": 35.6812, "lon": 139.7671, "timezone": "Asia/Tokyo", "timezone_offset": 32400, "current": { "dt": 1629008734, "sunrise": 1628971183, "sunset": 1629019889, "temp": 19.85, "feels_like": 20.37, "pressure": 1012, "humidity": 95, "dew_point": 19.03, "uvi": 0.37, "clouds": 75, "visibility": 5000, "wind_speed": 2.06, "wind_deg": 350, "weather": [ { "id": 701, "main": "Mist", "description": "霧", "icon": "50d" } ] }, {省略}
大量のデータを取得できます。
これをGoでParseして構造体にするにはこんな感じ。
使ってみてわかったこと。
- 大量のデータを取得できるので色んなことができそう。
- go get で扱えるようにしたい。
- とりあえず動くようにしただけなのでもっと作り込みがしたい。
GolangでLinebot②
前回の続き。もう少し意味のあるものにしていく。
作るもの
楽天市場APIを使って1日1回、楽天市場に出品されているワインの中でレビュー平均の降順でいくつかLineBotで通知しようというもの。
まずはRakuten DevelopersでアプリIDを発行してAPIをcallできるようにします。
公式の手順がわかりやすいので割愛します。
リクエストURLは以下のものを使用します。
https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?${params}
リクエストイメージ
Parameter | Value |
---|---|
applicationId | 自分のアプリID |
genreId | 100317 |
sort | +reviewAverage |
Hits | 2 |
https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?applicationId=${applicationId}&genreId=100317&sort=+reviewCount
applicationIdはHerokuの環境変数に設定してos.Getenv()で取得できるようにしときます。
以下が作成物になります。
あとは Heroku Schedulerで定期実行させます。
USTでしか指定できないので、9時間差で指定します。
作ってみてよかったこと
- 基本的な文法をおさらいできたこと。
- すでに結構身についていることが確認できてうれしい。
- Goのパッケージについて理解できたこと。
- JsonのParse処理を実装できたこと。
- 特にネストした配列の構造体を部分が理解できたのが大きかった。
反省点
GolangでLinebot
Herokuとは
Salesforceの提供するPaaS
価格アプリケーション起動時間の従量課金制。
マスに向けたWebサービスでなければ無料枠を超えるようなことはないと思う。
レンサバも持っていないので今回はHerokuを使っていく。
go-Linebot
まずはgo.modの初期化をしてline-botのsdkをgo getする。
go mod init github.com/${github URL} go get github.com/line/line-bot-sdk-go/linebot go mod tidy
一旦はmessage送信できるかどうかを確かめられればいいので、main.goの中身は以下の通り。
package main import ( "log" "os" "github.com/line/line-bot-sdk-go/linebot" ) func main() { bot, err := linebot.New( os.Getenv("LINE_BOT_CHANNEL_SECRET"), os.Getenv("LINE_BOT_CHANNEL_TOKEN"), ) if err != nil { log.Print(err) } // messageはLINEBOTで通知したい値を入れる。 message := linebot.NewTextMessage("go-linebot!") if _, err := bot.BroadcastMessage(message).Do(); err != nil { log.Print(err) } }
Heroku用のProcfileを作成
$ vi Procfile web: ./bin/${directory_name}
Heroku上で使用するGoのversion指定
2パターンあります。
go.modに
// +heroku goVersion go1.16
と記載するか、環境変数での指定ができます。
### cli $ heroku config:set GOVERSION 1.16
LINE Messaging APIの設定
channel type に Messaging API を指定して作成します。 providerがない場合はプルダウンで「Create a news provider」で作成します。
作成が終わったら、channelのBasing settingsから Channel secret tokenをコピーしておきます。Herokuの環境設定で使用します。
Messaging APIタブに移動して、Channel access tokenをコピーしておきます。これもHerokuの環境設定で使用します。
QRコードが表示されているのでLINEの友達追加から読み取って追加しておきます。
これで基本的な設定は完了です。
Herokuの設定
Heroku CLI で設定する場合と、ブラウザから設定する方法があります。
個人的にブラウザでやった方が簡単です。
Heroku CLIで設定する場合
Heroku CLI を installします。
$ heroku create ${app name} $ heroku config:set LINE_BOT_CHANNEL_SECRET ${Channel secret token} $ heroku config:set LINE_BOT_CHANNEL_TOKEN ${Channel access token} $ heroku git:remote -a ${app name}
ブラウザ(GUI)から設定する場合。
Herokuにログインしてダッシュボードを開きます。
Create new appでapplicationを作成します。
Settingsタブを開いて環境変数を指定します。
GOVERSION は go.modに記載した場合不要です。
Deployタブを開いてGit Hubを選択します。
Enable Automatic Deploysは指定したブランチにpushすると自動的にbuild & deployが走るので便利です。
Deploy Branchでbuild deployが走ります。
以下のようにBotからメッセージが届けば完了です。
とりあえず、動作確認ができたのでDynoを停止します。
停止しとかないと定期的にメッセージがきます。
Grafana PrometheusでMySQL監視
アーカイブをwget
## https://github.com/prometheus/mysqld_exporter/releases/tag/v0.13.0 $ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.13.0/mysqld_exporter-0.13.0.linux-arm64.tar.gz $ tar xvzf mysqld_exporter-0.13.0.linux-arm64.tar.gz $ cd mysqld_exporter-0.13.0.linux-arm64 $ cp mysqld_exporter /usr/local/bin/
mysqld_exporter用のユーザ作成
## see https://github.com/prometheus/mysqld_exporter/#required-grants $ mysql -h localhost -u {username} -p CREATE USER 'exporter'@'localhost' IDENTIFIED BY '{password}!';
Service化
$ vi /etc/systemd/system/mysqld-exporter.service [Unit] Description=mysqld_exporter [Service] Restart=always User=exporter ##お好みで Environment="DATA_SOURCE_NAME=exporter:{password}!@(localhost:3306)/" ExecStart=/usr/local/bin/mysqld_exporter [Install] WantedBy=multi-user.target ## 起動 $ systemctl daemon-reload $ systemctl start mysqld-exporter.service
prometheus.yml修正
$ vi /etc/prometheus/prometheus.yml ## 以下を追記する。 - job_name: 'mysqld_exporter' static_configs: - targets: ['localhost:9104'] ## Prometheus再起動 $ systemctl restart prometheus
ダッシュボード作成
以下のtemplateをimportしてダッシュボードを作成。
「Load」ボタンを押せばダッシュボードが作成される。
すごいきれいに見れます。
gccコマンド
Linuxを使っているとgccコマンドというのをよく目にする。
実際良くわかっていなかったのでメモする。
まず、GCCとは GNU Compiler Collectionの略でC,C++,Goなどのコンパイラコレクションとのこと。
gccコマンドはGNU C Compilerの実行ファイルを呼び出すコマンドなので、正確には別物である。
ちなみにCenoOS8では下記のコマンドを実行することで、make gcc g++ などのパッケージをinstallすることが可能。
$ sudo dnf group install "Development Tools"
makeがついてくるのはbuildの過程でgcc g++を使用することが多いためなのではないかなと思う。
じゃあJavaはどうなってるんだ
GNU Compiler for Java というものが存在していた。2016年から GCJはGCCのtrunckから削除され、GCC7.1のリリースから含まれていない。
以下のBlogにGCJ削除についてのPOSTがある。
(英語が読めないので翻訳して読みましたが、間違いがあるといけないので深入りしません。) tromey.com
gcj vs javacという感じでパフォーマンスについて言及されたPOSTも見つけたりしてかなり楽しい時間を過ごせました。
RaspberryPiのCPU温度を確認したい
vcgencmdを使って確認します。
$ dnf install cmake gcc gcc-c++ make アップグレード済み: cpp-8.4.1-1.el8.aarch64 gcc-8.4.1-1.el8.aarch64 gcc-c++-8.4.1-1.el8.aarch64 libgcc-8.4.1-1.el8.aarch64 libgomp-8.4.1-1.el8.aarch64 libstdc++-8.4.1-1.el8.aarch64 libstdc++-devel-8.4.1-1.el8.aarch64 インストール済み: cmake-3.18.2-11.el8_4.aarch64 cmake-data-3.18.2-11.el8_4.noarch cmake-filesystem-3.18.2-11.el8_4.aarch64 cmake-rpm-macros-3.18.2-11.el8_4.noarch libuv-1:1.40.0-1.el8.aarch64 vim-filesystem-2:8.0.1763-15.el8.noarch
$ ./buildme --debug ~/work/userland/build/raspberry/debug ~/work/userland cmake: symbol lookup error: cmake: undefined symbol: archive_write_add_filter_zstd make: *** ターゲットが指定されておらず, makefile も見つかりません. 中止. make: *** ターゲット 'install' を make するルールがありません. 中止.
ググるとcmakeで使用するlibarchiveのバージョンが古いとかでした。
bug reportも見つけました。 bugzilla.redhat.com
https://centos.pkgs.org/8-stream/centos-baseos-x86_64/libarchive-3.3.3-1.el8.x86_64.rpm.html
## https://github.com/ComplianceAsCode/content/issues/7016 $ dnf install libarchive ## 実行 $ ./buildme --aarch64 $ vi /etc/ld.so.conf.d/raspberrypi.conf ## 追記 /opt/vc/bin $ ldconfig ## PATHを通す $ vi ~/.bashrc PATH="/opt/vc/bin:$PATH" $ source ~/.bashrc ## CPU温度を確認 $ vcgencmd measure_temp temp=54.0'C
こんなことをしなくても
node_exporterのmetrixで簡単にGrafanaで可視化できます。
metrixはnode_thermal_zone_tempです。