ICTSC2021 夏の陣にご参加いただいた学生の皆様、お疲れ様でした。
今回のICTSC2021 夏の陣は前回のICTSC2020の運営と新しいメンバー、それに加えて機材の提供や作問などでご助力いただいたスポンサー様方のおかげでなんとか開催し無事終了することができました 。参加していただいた方々につきましては、ここで培った知識・技術を今後に活かしていただければと思います。
今回出題した問題の問題文、及び問題解説を公開します。
ぜひ今後の研鑽にご利用いただければと思います。
ICTSC2021 夏の陣にご参加いただいた学生の皆様、お疲れ様でした。
今回のICTSC2021 夏の陣は前回のICTSC2020の運営と新しいメンバー、それに加えて機材の提供や作問などでご助力いただいたスポンサー様方のおかげでなんとか開催し無事終了することができました 。参加していただいた方々につきましては、ここで培った知識・技術を今後に活かしていただければと思います。
今回出題した問題の問題文、及び問題解説を公開します。
ぜひ今後の研鑽にご利用いただければと思います。
Markdownのコンテンツをブラウザで閲覧できる社内サイトがある。
UML図も埋め込みが可能であったが、数ヶ月前から図の部分だけが表示されなくなってしまった。
それも、ほぼ同時期に、複数の端末で。
サーバ側は長年変更しておらず、特に心当たりもない。一体なぜ……。
prob16-webserver (192.168.16.200)
単体のWebサーバ構成/home/user/contents/
以下に .md
ファイルを設置すると、5分程度でWebコンテンツに反映されるprob16-desktop (192.168.16.100)
の設定/構成変更による解答は認められませんprob16-desktop (192.168.16.100)
及び 同様の端末(ログイン不可)において、http://192.168.16.200/page01.html や http://192.168.16.200/page02.html をブラウザで閲覧すると、UML図が表示されない。prob16-desktop (192.168.16.100)
及び 同様の端末(ログイン不可)において、http://192.168.16.200/page01.html や http://192.168.16.200/page02.html をブラウザで閲覧すると、UML図含めて全体が正常に表示される。prob16-webserver (192.168.16.200)
をOS再起動しても正常に表示される10080番ポートがbad-portとなり、各ブラウザのアップデートによりブロックされました。
初期状態ではplantuml-serverが10080番で稼働しているため、何らかの方法でブラウザから見えるポートを変更する必要があります。
# plantuml-serverを10081番ポートで上げ直す $ sudo docker run -d --restart=always -p 10081:8080 plantuml/plantuml-server:jetty # 変換スクリプトにおいて、plantuml-serverの指定ポートを10081番に変更する $ sed -i 's/192\.168\.16\.200:10080/192.168.16.200:10081/' /home/user/tools/conv.js # 変換スクリプトを手動実行する (又はcronの次回実行まで待機する) $ find /home/user/contents/ -name "*.md" | xargs node /home/user/tools/conv.js
※ firewalldで10080番の許可を入れていましたが、docker側でiptablesに追加されるので不要でした……
[[email protected] ~]$ crontab -l */5 * * * * find /home/user/contents/ -name "*.md" | xargs node /home/user/tools/conv.js >/dev/null 2>&1 3-58/5 * * * * find /var/www/html/ -name "*.html" -mmin +10 | xargs rm >/dev/null 2>&1 [[email protected] ~]$ grep -C 3 10080 /home/user/tools/conv.js }).use(require('markdown-it-plantuml'), { openMarker: '```uml', closeMarker: '```', server: 'http://192.168.16.200:10080' // plantuml-server }).use(require('markdown-it-meta'), { })
PlantUMLの公式サーバ http://www.plantuml.com/plantuml/svg/ を利用するという解答が3チームありました。
出題意図としては、機密情報等を扱う社内サイトを想定しており、自前のplantuml-serverを用意する構成としておりましたが、
確かに問題文では一切触れておらず、外部疎通性もありましたので、最も手軽な解決方法ではありました。
あなたは、「テレワークを行う社員の仕事用ルータをセットアップしておいてほしい。」と雑にタスクを割り当てられました。
作業内容は紙に書かれていました。
要約 サーバにVyOSがはいっています。 このサーバを社員の家に置くので、WireGuard VPNのクライアントの設定をいれてください。 簡単な仕事だと思いますが、よろしくお願いいたします。
EwxEvuDmdaKslWndieq1BFsNQgWjtyWKPe+kCDSc+nQ=
である。WireGuardの設定が入っていない。
WireGuardサーバ WireGuardクライアント アドレス 192.168.1.2:51820 ⇔ アドレス 192.168.1.1:51820 wg01アドレス 10.0.0.2/31 wg01アドレス 10.0.0.3/31
この問題は、WireGuardのクライアントの設定を作り、永続化する構築問でした。
VyOSにおけるWireGuardの設定は、公式のdocumentに詳細に書かれております。
最終的なVyOSの設定は想定解答では以下になります。
interfaces { ethernet eth0 { address 192.168.1.1/24 hw-id 9c:a3:ba:24:00:52 } loopback lo { } wireguard wg0 { address 10.0.0.3/31 peer wgserver { address 192.168.1.2 allowed-ips 10.0.0.2/31 port 51820 pubkey **************** } } } protocols { static { route 0.0.0.0/0 { next-hop 192.168.1.254 { } } } } service { ssh { } } system { 以下省略
以上で、永続化も行えます。
AくんはSSHに関する設定をいろいろいじっていたところ、SSHで繋がらなくなってしまった。
どうやらVNCはそのまま繋がるようなので、原因を特定して繋がるようにしてほしい。
この問題は3つのトラブルが原因でした。
KexAlgorithms
の設定エラーメッセージから鍵交換方式の設定がおかしいことがわかります。
$ ssh 172.16.0.1 Unable to negotiate with 172.16.0.1 port 22: no matching key exchange method found. Their offer: curve25519-sha256,[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1
これはクライアントの .ssh/config
に設定された鍵交換方法をコメントアウトしたり、Their offer
以下に書かれた方式を設定するなどで解決します。
サーバの /var/log/secure
を見ると以下のメッセージが見つかります。
: User user from 172.16.0.2 not allowed because listed in DenyUsers : pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=172.51.0.2 user=user : Failed password for invalid user user from 172.51.0.2 port 45508 ssh2
/etc/ssh/sshd_config
を見ると DenyUsers
ディレクティブに user
が含まれているので、許可されるよう設定します。
ちなみに、この DenyUsers
はトラコン運営が選んだわけではなく、CentOSのデフォルトの設定です。
エラーメッセージからSSHの多重化でトラブルが起きていることがわかります。
mux_client_request_session: session request failed: Session open refused by peer Failed to connect to new control master
sshd_config
を見ると MaxSessions
が 0
となっているのでこれを修正します。
ちなみに、この MaxSessions
というのは同時にSSH接続が可能な数ではありません。デフォルトは10になっていますが、これは11個目のセッションがはじかれるというわけではないのです。
新卒社員であるあなたは先輩社員のお手伝いをすることになりました。先輩社員は次のようなネットワークを作りたいと考えているそうです。
ある程度先輩社員は設定を行ったそうなのですが、通信が上手くできないそうです。助けてあげてください。
先輩のメモ
client1, client2
これらの機器は、802.1X認証をする機器です。/home/user/wpa_supplicant.confに接続に必要な情報が書かれています。以下のコマンドでサプリカントを起動することができます。/dataに起動時に実行されるインターフェース設定などが書かれたファイルが置かれています。
$ wpa_supplicant -B -D wired -i eth1 -c ./wpa_supplicant.conf
switch
この機器は、802.1X認証を受ける機器です。/dataに起動時に実行されるインターフェース設定などが書かれたファイルやオーセンティケーターを起動するためのコマンドなどが書かれています。
client1, client2はwpa_supplicantを利用することで、switchの認証を行うことができます。wpa_supplicantを停止しても3分程度は接続がつながりますが、しばらく待つと認証が切れて切断されます。
router
この機器は、認証用のデーモンが動いている機器です。freeradius, openldapが動作しています。
今回の問題は、LDAPに保存されているパスワードのハッシュアルゴリズムとMS-CHAPv2で利用できるハッシュアルゴリズムが異なっていることによって、認証が行えていないというのが問題でした。
そのため、LDAPにMS-CHAPv2で利用できるような形式でハッシュ化した属性を追加すればOKです。
sudo apt install samba sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/share/doc/samba/examples/LDAP/samba.ldif
sambaSIDはsambaSamAccount objectClassを利用するのに必須な属性です。なので、適当に生成する必要があります。sambaSIDは以下のようなスクリプトで生成することができます。
import binascii import hashlib import random def nt_hash(password): password = password.encode("UTF-16LE") hashed = hashlib.new("MD4", password).digest() return binascii.hexlify(hashed).decode().upper() def generate_samba_sid(): p1, p2, p3 = [random.randint(0, 4294967295) for _ in range(3)] return f"S-1-5-21-{p1}-{p2}-{p3}" password = input("password: ") print(nt_hash(password)) print(generate_samba_sid())
スクリプトでSIDとNTハッシュ化されたパスワードを生成したら、ユーザのパスワードを追加するLDIFファイルを作成してロードします。
dn: uid=adam,ou=Users,dc=2021-summer,dc=ictsc,dc=net changetype: modify add: objectClass objectClass: sambaSamAccount - add: sambaSID sambaSID: S-1-5-21-401484083-650785073-894160332 - add: sambaNTPassword sambaNTPassword: 1574D4A36AE4DE77D91A42E12B5F30B3
dn: uid=eve,ou=Users,dc=2021-summer,dc=ictsc,dc=net changetype: modify add: objectClass objectClass: sambaSamAccount - add: sambaSID sambaSID: S-1-5-21-883903360-3810299002-3370863084 - add: sambaNTPassword sambaNTPassword: 27B0A3ACE19B518DEDADBC9D9EF50BF6
sudo ldapmodify -h localhost -D cn=admin,dc=2021-summer,dc=ictsc,dc=net -W -f ./adam.ldif sudo ldapmodify -h localhost -D cn=admin,dc=2021-summer,dc=ictsc,dc=net -W -f ./eve.ldif
追加した属性をfreeradiusの方から利用できるようにするために、/etc/freeradius/3.0/mods-enabled/ldapを編集して、NT-Passwordが格納されている属性のマッピングを追加します。これによって、freeradiusでNTハッシュ化したパスワードを利用することができます。
# attribute ref. update { control:Password-With-Header += 'userPassword' control:NT-Password := 'sambaNTPassword' # reply:Reply-Message := 'radiusReplyMessage'
想定解の部分点は、パスワードをロードできた時点で200点、freeradiusの設定をするのを含めて300点になる予定でしたが、想定外解法(平文でパスワードを保存する解法)がほとんどでした。こちらの場合、終了条件に抵触しているわけではないので、こちらの場合でも同様に満点で採点しています。