[1] GW【📝】DevSecOpsThon at GMO kitaQ

[1] GW ブログリレー1日目はハッカソンの参加レポートになります。 ============================== 4月29、30日 北九州市が後援する学生向けインターネットインフラハッカソン「DevSecOpsThon at GMO kitaQ」に参加してきました。

[1] GW【📝】DevSecOpsThon at GMO kitaQ

[1] GW【📝】DevSecOpsThon at GMO kitaQ

[1] GW ブログリレー1日目はハッカソンの参加レポートになります。

==============================
4月29、30日 北九州市が後援する学生向けインターネットインフラハッカソン「DevSecOpsThon at GMO kitaQ」に参加してきました。


イベント詳細

DevSecOpsThon」とは、【開発(development)】【セキュリティ(security)】【運用(operation)】の
3つの要素を融合したDevSecOpsを学びながら、チームで協力して特定のお題に挑戦するコンテストです。
弊社のDevSecOpsThonの特徴として、サーバー構築・運用に焦点を当てたコンテンツを中心にしている、学生向けの開催である等がございます。
昨年よりもコンテンツをアップグレードし、期間も2日間に集約してお届けします。

より詳しくは以下のリンクから...
(URL : https://www.gmo.jp/news/article/8272/)


目次

1日目

問題1↪1
問題2↪2
問題3↪3
問題4↪4
問題5↪5
問題6↪6
問題7↪7

2日目

問題8↪8
問題9↪9
問題10↪10

あとがき↪Atogaki


Report

1日目

1. 問題1

問題

インターネット上で公開されている とある会社 WEBサイトの正常稼動を確認するため、与えられたLinuxの監視サーバー上から外部のwebサーバーのコンテンツを取得したい。

以下のようにコマンドラインから curl コマンドを利用してHTTPでコンテツを取得、パイプで渡して xmllint コマンドでHTMLをパースしてサイトのタイトルを抽出し、目的のサイトが正常に表示されていることを確認する

$ title="$(curl -sL http://www.とある.jp | xmllint --html --xpath '/html/head/title/text()' - 2>/dev/null)" 
$ echo ${title}
  テスト

が、どうやら様子がおかしい。期待されるレスポンスはとあるグループのコーポレートWEBサイトのタイトル「とある会社」である。どうやらテスト段階のコンテンツが表示されてしまっているようだ。

期待とは違うレスポンスが得られた理由を調査し、推定せよ。

推定に基づき、curl コマンドで "http[://]www[.]とある[.]jp" に接続し、想定される正しいレスポンス「とある会社」を得よ。

解決方法

DNSの設定が内部サーバー向けになっていたので、CloudFlare DNSの1.1.1.1の記述を/etc/resolv.confに追記しました。



2. 問題2

問題

インターナルIP / グローバルIP が割り振られている2台のサーバーがある。
しかし複数回のパスワードミスによりSSH不可が発生、その原因を見つけ解消してください。

  • Aruto(会場)からq3-[ ]-01 / q3-[ ]-02へのSSHは可能な状態である

  • q3-[ ]-01からq3-[ ]-02へのSSHは可能な状態である

  • q3-[ ]-02からq3-[ ]-01へのSSHが不可能状態である

    【SSH可能】
    ・Aruto(会場) → q3-[*]-01
    ・Aruto(会場) → q3-[*]-02
    
    ・q3-[*]-01 → q3-[*]-02
    
    
    【SSH不可】
    ・q3-[*]-02 → q3-[*]-01
    

構成図

kadai2.drawio.html
","toolbar":"pages zoom layers lightbox","page":0}">
解決方法

fail2banの設定を以下のコマンドでunbanする.

[root@q3-x-01 ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     9
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     3
   `- Banned IP list:   192.168.144.71
[root@q3-x-01 ~]# fail2ban-client set sshd unbanip 192.168.144.71
[root@q3-x-01 ~]# firewall-cmd --reload
success


3. 問題3

問題

webサーバとdbサーバを構築して、wordpressを動かそうとしています。

サーバはそれぞれグローバルとインターナルのIPを持ち、セキュリティのためデータベースはインターナルからのみ接続可能なように設定しようとしています。

現在webサーバー、dbサーバーともに途中まで作業が進んだ状態で、構築担当者が突然失踪してしまいました。続きの設定を完了してwordpressの初期画面を表示できるようにしてください。

構成情報

OSはUbuntu 22.04を使っています。

| HOSTNAME |  GLOBAL-IP  |  INTERNAL-IP  | USER-ID | USER-PASS  |
|  q1--web | 1++.++.++.+ | 192.168.144.* |  root   |   個別通知  |
|  q1--db  | 1++.++.++.* | 192.168.144.* |  root   |   個別通知  |
webサーバ作業概要
  • apacheインストール済み
  • phpインストール済み
  • wordpressのパッケージ/var/www/html以下に展開済み
  • configファイルへDBへの接続情報設定済み
dbサーバ作業概要
  • mariadbインストール済み
  • wordpress用データベース作成済み
  • wordpress用DBユーザ作成済み

構成図
kadai3.drawio.html
解決方法

DBとWebの2つのサーバーが渡される
担当者が失踪したらしい。

Web
  • ポート解法
    [root@q3-a-01 ~]# firewall-cmd --reload
$ ufw allow 80/tcp
$ ufw allow 3306

$ ufw reload
  • IPアドレスの設定
    vim /etc/network/interfaces
    で以下を追加
auto eth1
iface eth1 inet static
address 192.168.144.41
netmask 255.255.255.0

その後にインターフェイスをupる。
$ ip link set eth1 up

wordpress.conf
root@q1-a-web:~# cat /etc/apache2/sites-available/wordpress.conf 
<VirtualHost *:80>
    DocumentRoot /var/www/html
    <Directory /var/www/html>
        Options FollowSymLinks
        AllowOverride Limit Options FileInfo
        DirectoryIndex index.php
        Require all granted
    </Directory>
    <Directory /var/www/html/wp-content>
        Options FollowSymLinks
        Require all granted
    </Directory>
</VirtualHost>
root@q1-a-web:~# 
DB
  • ポート開放
$ ufw allow 3306

$ ufw reload
  • ufwを使用した接続のIPフィルタリング
$ ufw allow from 192.168.144.0/24 to any port 3306

$ ufw reload


4. 問題4

問題

インターナル/グローバルともにIPが割り振られている2台のサーバーがある。

1台はwebサーバーとして使用されている。
webサーバーの負荷を監視できるように、もう1台に監視サーバーを構築している。

サーバー構築担当者が突然失踪してしまっており、肝心の監視設定ができていない。
このままではserviceが正常に稼働できているか分からない。

至急、下記の監視設定を行え。

:::info
監視設定を行う順序については順不同です!

チーム全員で1つの監視設定をするのも、チーム内で手分けするのもOK!

全ての監視設定ができるように頑張ってください!

:::

監視設定 一覧

1.死活監視

webサーバーに対して、10秒ごとに死活(ping)監視を行い、
5回連続不通になった場合、ブラウザのZABBIXコンパネ上でアラート表示をさせよ。

ブラウザのZABBIXコンパネ上/
もしくは障害タブでアラート表示できているキャプチャも一緒に報告せよ。

:::tip
ヒント:シンプルチェック

:::

2.メモリのパフォーマンス監視

webサーバーのメモリ使用率を監視せよ。
使用率80%が超えた場合、ブラウザのZABBIXコンパネ上でアラート表示をさせよ。

ブラウザのZABBIXコンパネ上/
もしくは障害タブでアラート表示できているキャプチャも一緒に報告せよ。

:::tip
ミニヒント:要zabbix-agent設定

:::

3.CPUのパフォーマンス監視

webサーバーのCPUの使用率を監視せよ。
使用率が80%が超えた場合、ブラウザのZABBIXコンパネ上でアラート表示をさせよ。

ブラウザのZABBIXコンパネ上/
もしくは障害タブでアラート表示できているキャプチャも一緒に報告せよ。

:::tip
ミニヒント:要zabbix-agent設定

:::

4.Networkのパフォーマンス監視

webサーバー上のネットワークトラフィックを10秒ごとに監視し、
受信/送信それぞれ、連続6回以上使用率50%以上の場合に、ブラウザのZABBIXコンパネ上でアラート表示をさせよ。

ブラウザのZABBIXコンパネ上/
もしくは障害タブでアラート表示できているキャプチャも一緒に報告せよ。

:::tip
ミニヒント:要zabbix-agent設定

:::

5.サービス監視

webサーバーのnginx serviceの稼働状態を監視せよ。
サービスが動作していない場合、ブラウザのZABBIXコンパネ上でアラート表示をさせよ。

ブラウザのZABBIXコンパネ上/もしくは障害タブでアラート表示できているキャプチャも一緒に報告

:::tip
ミニヒント:要zabbix-agent設定

:::

6.webページの応答時間の監視1

zabbixのwebscenario機能を使い、Webページ【http[://]WebサーバーIP】の読み込み時間を監視せよ。
読み込み時間が1秒よりかかる場合に、ブラウザのZABBIXコンパネ上でアラート表示をさせよ。

ブラウザのZABBIXコンパネ上/もしくは障害タブでアラート表示できているキャプチャも一緒に報告

:::tip
ミニヒント:webシナリオ

:::

7.webページの応答時間の監視2(リダイレクト対応)

zabbixのwebscenario機能を使い、リダイレクトするWebページ
【http[://]WebサーバーIP:50080】の読み込み時間を監視せよ。
読み込み時間が1秒よりかかる場合に、ブラウザのZABBIXコンパネ上でアラート表示をさせよ。

ブラウザのZABBIXコンパネ上/もしくは障害タブでアラート表示できているキャプチャも一緒に報告

:::tip
ミニヒント:6とほんの少しの違い

:::

8.サーバーのSSHログ監視

webサーバーのSSHのログを監視せよ。

認証失敗のログがあった場合に、ブラウザのZABBIXコンパネ上でアラート表示をさせよ。

ブラウザのZABBIXコンパネ上/
もしくは障害タブでアラート表示できているキャプチャも一緒に報告せよ。

:::tip
ミニヒント:Active Check

:::

9.アラートの通知:メール

Webサーバーのアラートが検知された際にメールを送信せよ。
送信元/先のアドレスは下記とする。

メールサーバー:192.168.144.254
送信元:team-X@devsecopsthon.*
送信先:tema-atruto@+++.*

:::tip
ミニヒント:ユーザーメディア

:::

10.アラートの通知:Slack

アラートが検知された際にSlackへアラートメッセージを出力せよ。

:::tip
ミニヒント:Slack-API

:::

解決方法

気合でzabbix_agentを生き返らせた。
情緒が不安定だった。気合でトリガーをごにょごにょしてうにゃうにゃしてた。

課題4の小問2番のひとつし解けなかった。
自分の家のサーバー上でこの環境を再現してみたい、、



5. 問題5

問題

WordPressのログインページに不正なアクセストライが。。。
セキュリティ向上のために、該当アクセスを確認して対策しましょう!
正常なアクセスへ影響を出さずに不正と思われるIPを全て遮断して報告してください!

作業環境

OS:Ubuntu 20.04.3 LTS

下記インストール済

nginx version: nginx/1.23.4
wordpress-6.2
php 7.4
mysql Ver 15.1 Distrib 10.3.38-MariaDB

解決方法

正常IP:

+++.++.+.18 
+++.++.+.55 
+++.++.+.238

攻撃IP:

上記以外の+++.++.*.0/24

・攻撃者はID固定でアクセスのたびにパスワードを変えています。

・攻撃者のユーザエージェントを見るとアクセス毎に異なっており、不審であると疑える。

・正常なアクセスはID/PASSともに共有したものになっています。

個人的な感想

1秒間に500アクセスくらいなら人力でやるのが一番手っ取り早いと思いました。
アクセスログを解析するだけでも正常IPと攻撃IPの相違点が見えてくるのではないかな。。
また、「正常なアクセスはID/PASSともに共有したものになっています」という部分で、そこを見て判断するのかと感動しました。学びです。



6. 問題6

問題

他システムから移行してきたwordpressのサイトが遅いとのこと。

ネット上の情報でチューニングしたが変わらないので、チューニングして欲しいと依頼がありました。

「多くのアクセスに対して」「正しい応答を返す」ことを目指してチューニングを実施して ください。 アクセスはサイトのトップページだけではなく、各個別の記事にも行われます。

計測タイミングは全4回実施されます。
初回は今のサイトの状態を確認してみてください。

その後、2回の中間計測と、最終計測があります。
計測時に、コネクションエラーなどのfailedが10%以上orレスポンスタイム3秒超過が5%以上

しますと、計測が自動的に止まります

解決方法

私たちのチームはphp-fpmの設定をいじいじしました。
が、結果は...

驚異の12

IMG_3624

となってしまいした。

まだ試しきれていないので、自宅のサーバーに同様の環境を構築し、完全再現させ。
よりnginxの気持ちを知っていきたいです。

大会側の回答

下記などを参考にしてみてください

https://qiita.com/mikene_koko/items/85fbe6a342f89bf53e89

以下ファイルはデフォルト値から変更をしておりました。

/etc/nginx/nginx.conf

events {
    worker_connections  1024;
}
↓
worker_processes  1;
worker_rlimit_nofile 30;
events {
worker_connections  40;
}

keepalive_timeout  65;
↓
keepalive_timeout  0;
/usr/lib/systemd/system/nginx.service
LimitNOFILE=24 を追記
/etc/php/7.4/fpm/php-fpm.conf
process.max = 2
↓
process.max = 1
/etc/php/7.4/fpm/pool.d/www.conf
pm.max_requests = 10を追記
補足

コンテンツの更新が無いことが分かっている場面では、mysqlのクエリキャッシュやfastcgi_cacheも効果が大きいです。



7. 問題7

🛠️
注意事項

※ WARNING

本内容はセキュリティに関する知見を広く共有する目的で執筆されており、脆弱性の悪用などの攻撃行為を推奨するものではありません。

許可なくプロダクトに攻撃を加えると犯罪になる可能性があります。

ここ記載された情報を参照・模倣して行われた行為に関して筆者は一切責任を負いません。

問題

省略

課題詳細

2021年 12月5日に Apache Log4j という Java のログ出力ライブラリに脆弱性が見つかったと公開されました。

この脆弱性は、遠隔の第三者が細工したデータを送ることで、任意のコード・コマンドを実行できる というもので、重大度を示すスコアには最大の 10.0 が付けられました。

皆さんご存知の通り、Java は有名なプログラミング言語であり、 過去には 30億のデバイスで走るJava というキャッチフレーズが付けられていたことをご存知の方もいらっしゃるでしょう。システムは基本的にログを出力するものであるため、有名なプログラミング言語の基本的な機能に脆弱性が見つかったことの影響は大変大きなものでした。実際、アメリカ政府が複数の IT 企業を招集した会議を開いたり、NHK で報道されたり世界中で話題になりました。

この Apache Log4j の脆弱性がここまで話題になったのは、脆弱性の深刻度を表すスコア (CVSS) が高いことや、広く使われている OSS に脆弱性があったことももちろんそうですが、脆弱性の悪用が比較的容易だったことも挙げられます。実際、どのような方法で攻撃が可能なのか、少し詳細を見てみましょう。

Log4j にはログに記載された文字列から一部の値を変数として評価する Lookup 機能が実装されています。本脆弱性はこの機能のうち JNDI Lookup という機能を悪用したものです。例えば Web サーバの場合、HTTP リクエストのメソッド、パス、ヘッダーなどをログに書き込むことがありますが、このときログに含まれる外部の URL もしくは内部パスから Java クラスファイルを取得 (デシリアライズ) し、実行してしまうというものです。

この脆弱性を使った悪用の例として、ランサムウェアへの感染や、仮想通貨のマイニングマルウェアの展開、機密情報を盗み取ることなどが考えられます。

解決方法

課題6

  1. この小問については途中までできていたみたいですが、他のチームメイトが解いていたため、定かではありません。

2.今回取り上げている脆弱性の CVE 識別番号
CVE-2021-44228

  1. 今回取り上げた脆弱性の影響範囲(バージョン番号)
    Apache Log4j-core 2.15.0より前の2系のバージョン

  2. 今回取り上げたソフトウェアの脆弱性が見つかったことより、影響のあったサービス、または企業名を 3 つ
    (例)
    ・サービス/企業名 (ソースとなるURL含む)

・VMware / VMware, Inc
(https://www.vmware.com/security/advisories/VMSA-2021-0028.html)
・JAVA 版 / MINECRAFT
https://www.minecraft.net/ja-jp/article/important-message--security-vulnerability-java-edition-jp)
・Oracle Cloud / Oracle
(https://www.oracle.com/security-alerts/alert-cve-2021-44228.html#Appendix3RD)



2日目

8. 問題8

問題
課題内容

みなさんは Wordpress を VM 上に稼働させています。
とある理由により、別の VM に移行 (お引越し) させたいと考えました。

できるだけダウンタイム (使えない時間) 無しを目指して移行を完了させてください。
移行先の VM には Web サーバやデータベースはインストール済みですが、設定はしておりません。

チームAの場合、

  移行元 q8-a1
  移行先 q8-a2

VM 内ではデータベースも動かしているため、そちらも移行をしてください。

記事に対するコメント投稿機能については今回の課題では考慮しなくて大丈夫です。(無効にしております)

また、実際に公開しているサービスの IP の変更が伴う移行作業の場合、DNS の変更も必要です

この変更部分も実際に行ってみましょう。ここで設定する IP アドレスは プライベート IP アドレスでお願いします。

hosts に設定するのはグローバル IP アドレスですが、DNS の設定は プライベート IP アドレスとなります

まとめ

  • Wordpress およびデータベースを移行先 VM へと移行する
    • 移行先 VM で Wordpress、データベースの設定をする
  • DNS レコードを変更する
  • 移行完了後、運営まで報告をする
参考 URL

課題を始める前に行ってほしいこと
hosts ファイルの変更

Wordpress に限らず、サービスをインターネットに公開する場合、基本的にドメインがセットになっているのがほとんどです。

今回はみなさんの hosts ファイルを修正してもらい、ドメイン名でアクセスできるようにしていただければと思います。

LinuxとMAC の場合は /etc/hosts に、Windows の場合は C:\Windows\System32\drivers\etc\hosts を変更してください

+++.++.37.127 mng.aru.local

+++.++.37.126 www.x.aru.local
構成情報

各サーバの情報について

管理サーバ
  • DNS 権威サーバ
  • Uptime kuma

DNS レコードを修正できるように、Web UI を用意しています

http://mng.aru.local:9191/

ログインユーザ名、パスワードは以下の構成情報をご確認ください

各サーバのダウンタイムを監視するため、Uptime Kuma (https://github.com/louislam/uptime-kuma) を使用しています

こちらでみなさんのサーバが利用可能な状態になっているか確認します。

主に運営側が利用します

http://mng.aru.local:3001/status/x

Wordpress 初期ページ

http://www.x.aru.local/wordpress
参加者サーバ

みなさんにお配りしているサーバには、以下をインストール済みです

  • Apache 2.4.41
  • Nginx 1.18.0 (停止状態)
  • PHP 7.4.3
  • MariaDB 10.3.38
  • PHPMyAdmin 4.9.5

また、移行元サーバには Wordpress データを /var/www/html/wordpress に配置しています

解決方法

scpでデータだけ移行して、両方にアクセスさせ、片方のTTLを5分後、TTL 1minute
にし、最終的に移行先にだけアクセスさせるようにしました。

DNS浸透についても考慮しましたが、この条件下では意味があったのかなかったのか。どうなのだろうか。。Uptime-kumaのpingを飛ばす間隔が初期設定だと60sごとになので、、それを考慮すると、意味はないような。。。。うーん。



9. 問題9

問題

あなたはwebサーバ(AlmaLinuxのローカルミラー)の管理担当者です。

来週セキュリティ監査があるとの連絡があったため、サーバのカーネルをアップデートしました。

その後にサーバを再起動したところ、ローカルミラーサイトのコンテンツが消失してしまいました。

何が起きているのか原因を調査し、新しいカーネルで起動してもローカルミラーサイトが表示できるように修正してください。

以下のURLで元のサイトが表示されればOKです。

http://<チームのGlobalIP>/

起動画面確認のためwebコンソールが用意されています
(普通にクリックするとページ内遷移になってしまい正しく表示されないことがあるので、その時は右クリックのメニュー等から別タブで開く、コピーして別タブにペーストする等で開いてください)

<http[://]+++.++.++.+:50090/>

こちらから自チーム用のURLを発行し、アクセスしてください。

解決方法

yum update kernel-devel

dkms install -m zfs -v 2.1.9 -k 4.18.0-425.19.2.el8_7.x86_64

modprobe zfs

zpool import

zpool import zpool1

下記3つすべてOKでクリア

uname -e 結果
4.18.0-425.19.2のverであること(それが新しいカーネルverのため)

Linux [hostname] 4.18.0-425.19.2.el8_7.x86_64 #1 SMP Tue Apr 4 05:30:47 EDT 2023 x86_64 x86_64 x86_64 GNU/Linux

df結果は下記が見えていること

zpool1/www_html    97G   62G   36G   64% /var/www/html
zpool1             36G  128K   36G    1% /zpool1

個人的な感想

dkmsは偉大。

dkmsはどこかで使ったことがあったが、これから汎用性や用途もついでに調べるようにする。



10. 問題10

問題

問題と言うかプレゼンテーションでした。
どこもチームも家に帰ったら自宅サーバー立てますや自宅サーバー立てていますなどとても恐ろしい発表でした。

自宅サーバーはインフラ等を学ぶ上ではないよりはあったほうがいいので導入することを強くおすすめします。



Atogaki (編集後記)

team Aとして他の参加者の方と予め決められたteamで出題される問題と葛藤しました。惜しくも4位と結果になりましたが、ここで得られた学びは自分にとってとても新鮮なものとなりました。サーバー構築など本当に1からネットのことを知ろうと思えるきっかけとなっています。

著:工学部情報工学科3年
   [suisan (@u_i_san)]



※変更履歴

5/3(水) 16:40 現在
確認が取れ次第問題文や解説の方は載せさせてもらいます。

5/3(水) 19:00
確認のいらない範囲で書き加え、途中です。

5/8(月) 10:45
すべて記録しました。