/

問題文

あなたは新入社員のメンターとして研修に参加していました。
ある日、上司に急用が入り、
「今から日曜まで出張に行ってくるから、それまでに研修用のWebサーバにアクセスできることだけ確認しといて!」
と言われました。しかし、指示されたサーバーである http://192.168.9.1 にアクセスしても何も表示されません。

このサーバーはWebサーバーとしてLighttpdがインストールされており、現在の状態に戻す方法がわかっていれば自由に設定を変更することは許されています。

Webサーバが動作した上で同じ問題が再発しないように修正を行い、以下を上司に報告してください。
– トラブルの原因
– 解決のために行ったコマンド
– 行った変更を元に戻すためのコマンド

情報

  • IPアドレス: 192.168.9.1
  • ユーザー: admin
  • パスワード: hello-world
  • インストールされているWebサーバー: lighttpd

問題のスタート状態

  • サーバーへのHTTP通信が失敗する

問題のゴール状態

  • サーバーへHTTP通信が成功し、ブラウザから見るとLighttpdのプレースホルダのページが表示される
  • 来年以降同じ問題が再発しないよう設定する

トラブルの概要

systemdで起動時のターゲットにWebサーバ(lighttpd)が登録されていない

解説

この問題は、Ubuntu 18.04のinitシステム(起動時に最初に呼び出される、その他に起動に必要なアプリケーションを起動したりシステムを管理するためのアプリケーション)であるsystemdを用いた環境で「サービス」(デーモン)が起動していないというトラブルです。
使用しているサーバーはUbuntu 18.04を使用しています。このディストリビューションでは、initシステムとしてsystemdを採用しています。
initrcやinitngなどを使用しているシステムでは /etc/init.d/ 配下にあるファイルを用いて起動していますが、systemdを使用したシステムでは systemctl というコマンドを使用します。

また、OS起動時に自動起動する設定も同じコマンドで行います。

今回のトラブルでは、Webサーバーはインストール済みの状態ですので、このコマンドを使用してサービスを起動/停止することで解決可能です。

systemctl start lighttpd
systemctl stop lighttpd

また、この変更のみでは自動起動はしないため、設定を元に戻すコマンドは必要ありません。
しかし、自動起動設定を行った場合は自動起動設定を停止するコマンドも投入する必要があります。

自動起動設定コマンドと停止コマンドは以下のとおりです。

systemctl enable lighttpd
systemctl disable lighttpd

回答例

お疲れ様です。解答を送信します。

今回のトラブルは、lighttpdが起動していないことが原因でした。
lighttpdはインストール済みのため、以下の手順でWebサーバの起動をすることができます。

Webサーバの起動

systemctl start lighttpd

また、同じ問題が再発しないよう、研修終了までWebサーバを自動起動するようにします。

Webサーバの自動起動の設定

`systemctl disable lighttpd

これらの設定を元に戻す方法は以下のとおりです。

Webサーバの停止・自動起動の解除

systemctl stop lighttpd
systemctl disable lighttpd

採点基準

  • 上記手順をすべて達成して100%
  • 自動起動をしていない -10点
  • 元に戻す方法を記述していない -10点

講評

この問題は「コンテストサイトの使い方を学ぶための簡単な問題」という位置づけだったこともあり、とても簡単な問題でした。そのおかげで、全チームに満点を付与することができました。作門者もにっこり喜んでいます。
Webサーバの設定ファイルを変更したチームもありましたが、もしかしたら惰性や習慣で systemctl start lighttpd をしてしまったのかなと個人的には思っています。
私も以前に似たようなことを行い、問題解答不能になったことがありました。
実際にサーバーに対して操作を行う際には、原因の調査と解決を分けて考えることで
「なぜこのトラブルが起きているのか?」を正しく判断することができ、
また「どのようにしてこのトラブルを解決するか」が分かれば、トラブル解決の途中で新たなトラブルに遭遇した際にも
「どのようにして環境をロールバックするか」を理解することにつながると思います。
トラブルが起きている当初の環境への復旧(ロールバック)は「ICTSCの問題環境」では簡単に行えますが、実務環境では大抵できません。ここからの締めの文章が浮かびませんが、みなさん頑張ってください。

問題タイトルは、「新人(入社数ヶ月)が新人(入社数日)のメンターになり、新人研修を行っている」ようなシチュエーションを考えて付けましたが、問題文を作る能が無く、なーんか変な内容になってしまいました。

 /

問題文

通話が繋がらない!

離れたオフィス間でも円滑にミーティングをできるように社内ミーティングサービスを運用している。
セキュリティ強化として入社した新入がLinux Routerにとある変更を行ったところ、社内ミーティングサービスが動作しなくなった。

このままだと、別支店のチームがミーティング参加ができなくなる!

一刻も早く修正せよ!

情報

  • 社内ミーティングサービスURL: https://192.168.8.19/

Linux router X

IPアドレス: 192.168.8.1
ユーザー: admin
パスワード: a3nVn22U

Linux router Y

IPアドレス: 192.168.8.9
ユーザー: admin
パスワード: PGrydZ1

Application Server

IPアドレス: 192.168.8.19
ユーザー: admin
パスワード: ani8EZu

使用手元機材の情報

Client A(支店A)

2960-A: FastEthernet 0/1

Client B(支店B)

2960-A: FastEthernet 0/2

問題のスタート状態

参加者PC同士での社内ミーティングサービスを使用したビデオ通話ができない。

問題のゴール状態

参加者PC同士での社内ミーティングサービスを使用したビデオ通話ができる。

構成

注意事項

この問題で使用するブラウザは「Google Chrome」と「Firefox」のみです。
これら以外のブラウザでは問題回答ができませんので、このブラウザで動作確認をしてください。

この問題を解く際は、参加者PCを無線Wifiに接続せず使用手元機材の情報に記述されている有線LANポートのみに接続してください。
参加者は自身のPCからApplication ServerにHTTPSでアクセスすることで社内ミーティングサービスを利用することができます。
このサービスではHTTPS通信に自己署名証明書を使用をしております。そのため、ブラウザからアクセスした際に証明書の警告がされます。

トラブルの概要

社内ミーティングサービスではWebRTCが使用されており、ビデオ通話などのメディアデータの送受信は基本的にP2PでClient同士が通信するものである。
今回Client同士がP2P通信するための経路情報が互いのLinux routerに登録されていないために発生したトラブル。

解説

トラブルの概要の通り、Linux router XとLinux router Yにて、互いの経路情報を登録する。

永続化については問題文に明記していないので、永続化の有無については得点への反映はない。

解答例

Linux router X

# # 経路追加
# route add -net 192.168.8.8 netmask 255.255.255.248 gw 192.168.8.18
# # 永続化
# cat /etc/network/if-up.d/branch-b-routing
#!/bin/sh
/sbin/route add -net 192.168.8.8 netmask 255.255.255.248 gw 192.168.8.18

Linux router Y

# # 経路追加
# route add -net 192.168.8.0 netmask 255.255.255.248 gw 192.168.8.17
# # 永続化
# cat /etc/network/if-up.d/branch-a-routing
#!/bin/sh
/sbin/route add -net 192.168.8.0 netmask 255.255.255.248 gw 192.168.8.17

講評

ICTSC 2018お疲れ様でした。

今回の問題は、解答を見てしまえばとても簡単な解決方法だったかと思います。
ソースコードのほとんどは、ICTSC2018 一次予選のWebRTC問題とほとんど一緒です。

しかし、今回の問題では、テキストチャットがWebRTC通信が確立できていない際に、アプリケーションサーバを介して通信するため、戸惑ったチームも多かったかと思います。

回答率は他の問題に比べ低かったですが、WebRTCに使用されている様々な、プロトコル、技術を考慮している解答も見られ、WebRTCを多くの人に知ってもらいたかった作問者としては非常に嬉しかった結果でした。

 /

問題文

あなたの部署では IPv6 のネットワークを使用しており、ルータ以下に fd00:10::/64fd00:11::/64 の2つのサブネットがあり、それぞれのサブネットに端末がある。fd00:10::/64 には端末1が存在し fd00:11::/64 には端末2が存在している。

fd00:11::/64 のサブネットでは今まで静的に IPv6 アドレスを割り当てていたが、自動的な割り当てに切り替えることになった。ところが、切り替え作業時にオペレーションミスが発生してしまい、端末2が IPv6 アドレスを失ってしまったらしく、端末1から端末2へアクセスできなくなってしまった。

この状態から切り替え作業を完了させ、端末2に fd00:11::/64 の IPv6 アドレスを自動的に割り当てて端末1からアクセスできるようにしてほしい。なお端末2のアドレスとしては fd00:11::100 - fd00:11::199 の範囲のみが使用を許可されている。

情報

ルータ

IPアドレス: 192.168.10.1
ユーザー: admin
パスワード: w4HcAsJS

端末1

IPアドレス: fd00:10::2
ユーザー: admin
パスワード: w4HcAsJS

ルータからアクセスすることが可能です。

端末2

ユーザー: admin
パスワード: w4HcAsJS

構成

10_ryo_image.png

トラブルの概要

  • 端末2に静的に割り当てていた IPv6 アドレスが消えている
  • DHCPv6 の設定が入っていない

解説・解答例

まず、問題文を読めば以下の事項が要求されているとわかります。

  1. サーバ2に自動的にIPv6アドレスを割り当てる
  2. 自動的に割り当てるIPV6アドレスは fd00:11::100 - fd00:11::199 でなければならない

IPv4であれば、自動的にアドレスを割り当てる場合にはDHCPを利用します。一方でIPv6アドレスを自動的に割り当てる方法としては以下の二つがあります。

  1. Router Advertisement (RA) を利用したステートレス自動割り当て
  2. DHCPv6 を利用したステートフル自動割り当て

ステートレス自動割り当てではサーバがルータからRAというメッセージを受け取り、RAで配布された情報とサーバのインターフェースのMACアドレスを組み合わせてIPv6アドレスを生成します。そのため、特定の範囲内のアドレスを使わせることが不可能です。したがってDHCPv6を使わなければならないことがわかります。

そこでルータの fd00:11::/64 のインターフェースにDHCPv6の設定を行いましょう。

まずはルータにsshします。

$ ssh admin@192.168.10.1
Welcome to VyOS

sshの際にルータがVyOS であることがわかります。VyOS のコマンドで設定していきましょう。

$ show conf
ethernet eth2 {
address fd00:11::1/64
duplex auto
smp_affinity auto
speed auto
}

コンフィグを見るとeth2fd00:11::/64のインターフェースだとわかります。

$ conf
$ set service dhcpv6-server
$ set service dhcpv6-server shared-network-name eth2 subnet fd00:11::/64 address-range start fd00:11::100 stop fd00:11::199
$ edit interfaces ethernet eth2
$ set ipv6 router-advert send-advert true
$ set ipv6 router-advert managed-flag true
$ set ipv6 router-advert other-config-flag true
$ exit
$ commit; save

address-rangeでIPv6アドレスの範囲を指定します。これは、問題文に指定されている通り fd00:11::100 - fd00:11::199 にしましょう。

またeth2においてRAを有効にします。これは、DHCPv6による割り当てを使う場合でもまずはサーバがルータからRAを受け取る必要があるからです。DHCPv6でIPv6アドレスを配布するにはさらにmanaged-flagを有効にする必要があります。other-config-flagはDHCPv6サーバでネームサーバなどの情報を配布するかどうかのオプションであるため、ここでは有効にしていますが、無効でも良いです。なお VyOS ではother-config-flagに関わらず、デフォルトゲートウェイがRAを配布したインターフェースに設定されるようです。

さて、これでサーバ2にアドレスが割り振られるはずなので見てみましょう。以下のコマンドで割り当てられてい DHCPv6アドレスを確認することができます。

$ show dhcpv6 server leases
There are no DHCPv6 leases.

ところが、予想に反して、割り当てられているIPv6アドレスがありません。ルータとサーバ2の間に何らかのトラブルが発生していることが想定されます。サーバ2にsshしてトラブルシューティングを行いたいところです。しかし「サーバ2が IPv6 アドレスを失ってしまったらしく、サーバ1からサーバ2へアクセスできなくなってしまった」とあるように、サーバ2に割り当てられていた静的なIPv6アドレスは失われてしまっています。

ここで、IPv6のリンクローカルアドレスを使います。IPv6が有効になっている全てのインターフェースには、MACアドレスから自動生成されたリンクローカルアドレスが割り当てられています。これは、その名の通り同じL2にいるインターフェース同士の通信に使用することができます。したがって、ルータからであればサーバ2のリンクローカルアドレスにアクセスすることができます。

サーバ2のリンクローカルアドレスはわからないので探しましょう。そのためには、IPv6のマルチキャストが有効です。IPv6にはリンクローカルなマルチキャストアドレスがあらかじめいくつか定義されており、同じL2に存在する特定の種類のインターフェース全てに通信することができます。ここでは、リンクローカルな全てのノードのアドレスを調べるためにeth2からff02::1に ping します。

$ ping6 -I eth2 ff02::1

これを実行すると1つ以上のインターフェースから応答があるはずです。なお、一度通信したことのあるインターフェースのアドレスは以下のコマンドでも調べられます。RAを有効にした後であれば、上記のpingのマルチキャストを行わなくても複数のインターフェースを見つけられるかもしれません。

$ show ipv6 neigh

ここまででサーバ2のインターフェースの候補がわかるはずなので、あとは地道にsshを試していきます。与えられたユーザとパスワードでログインできるのがサーバ2です。なお、リンクローカルアドレスにsshするときはアドレスの末尾に%eth2を追記して、インターフェースを明示する必要があります。

$ ssh admin@{{link local address}}%eth2
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-45-generic x86_64)

ログインに成功するとUbuntu 18.04であることがわかります。iproute2のコマンドでインターフェースを見ると、アドレスが振られていないのがわかります。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:5e:e0:21:7e brd ff:ff:ff:ff:ff:ff
inet6 fe80::5054:5eff:fee0:217e/64 scope link
valid_lft forever preferred_lft forever

Ubuntu 18.04ではネットワークインターフェースの管理にNetplanというソフトウェアを使っています。設定ファイルは/etc/netplan/以下にあります。今回は/etc/netplan/99-network-config.yamlが存在し、以下のように書かれています。

network:
version: 2
ethernets:
eth0:
dhcp4: false
accept-ra: false
gateway6: fd00:11::1

ここからRAが無効になっているとわかります。これではDHCPv6によるアドレス割り当てを行うことができません。そこで、RAとDHCPv6を有効にします。また、ゲートウェイはRAによって設定されるので、静的な設定は消してしまいます。

network:
version: 2
ethernets:
eth0:
dhcp4: false
dhcp6: true
accept-ra: true

書き換えて保存したら、以下のコマンドで設定を反映させます。

$ sudo netplan apply

すると今度はDHCPv6によって割り当てられたアドレスが確認できるはずです。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:5e:e0:21:7e brd ff:ff:ff:ff:ff:ff
inet6 fd00:11::199/128 scope global dynamic noprefixroute
valid_lft 43196sec preferred_lft 26996sec
inet6 fe80::5054:5eff:fee0:217e/64 scope link
valid_lft forever preferred_lft forever

問題が解決したかどうか確かめるために、サーバ1からこのアドレスにpingしてみましょう。

$ ssh admin@fd00:10::2
$ ping fd00:11::199
PING fd00:11::199(fd00:11::199) 56 data bytes
64 bytes from fd00:11::199: icmp_seq=1 ttl=63 time=1.38 ms
64 bytes from fd00:11::199: icmp_seq=2 ttl=63 time=1.17 ms

成功していれば、問題解決です。当初の目的通りに、サーバ2に特定の範囲のIPv6アドレスを自動的に割り当てることができました。

採点基準

想定解法の場合

  • サーバでRAを設定している: 60点
  • サーバでDHCPv6を設定している: 70点
  • 端末2にリンクローカルアドレスで接続している: 70点
  • クライアントを正しく設定している: 40点

その他の解法の場合

  • IPv6アドレスが正しく割り当てられている: 140点
  • 端末1から端末2へpingが通る: 100点

参考

この問題を解く、あるいは解説を理解するにあたって参考となるウェブページを上げておきます。

  • RAとDHCPv6について: https://www.infraexpert.com/study/ipv6z5.html
  • IPv6ユニキャストアドレスについて: https://www.infraexpert.com/study/ipv6z3.html
  • IPv6マルチキャストアドレスについて: https://www.infraexpert.com/study/ipv6z10.html
 /

問題文

あなたの後輩が「FTPが動かない」と相談してきました。後輩の頼みを断れないあなたはこの問題を見てみることになりました。
どうやら家の外から認証は出来そうなのですが、ディレクトリ一覧を見ることが出来なさそうです。

手元PCから192.168.7.1で接続し、ディレクトリ一覧を取得できるようにしてください。

情報

server

routerがport forwardingを行っているため、routerのIPアドレスにSSHをすればserverに接続することが可能です。

IPアドレス: 192.168.7.1
ユーザー: admin
パスワード: cf1e8c14e54505f6

router

もしログインするのであれば、serverを踏み台にしてアクセスしてください。

IPアドレス: 192.168.7.254
ユーザー: admin
パスワード: f3395cd54cf857dd

トポロジー図

禁止行為

  • 以下の設定を変更してはいけない。
connect_from_port_20=YES
  • 以下のルールを削除・無効化してはいけない。
iptables -A OUTPUT -p tcp --sport 20 -j REJECT

解説

問題文に「家の外から認証は出来そうなのですが、」とあるように、家の外から接続することが出来ないようです。家の外で接続する場合、途中でアドレス変換(NAT)されたり、routerに入力されるパケット(inboundのパケット)を制限されている場合があります。そのため、ACTIVEモードよりもPASVモードで接続する方が接続しやすいでしょう。

まず、192.168.7.1にFTPで接続してみます。

$ ftp 192.168.7.1
Connected to 192.168.7.1.
220 (vsFTPd 3.0.3)
Name (192.168.7.1:root): admin
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pass
Passive mode on.
ftp> ls
227 Entering Passive Mode (192,168,7,129,169,115).
ftp: connect: Connection timed out
ftp>

すると、227 Entering Passive Modeというレスポンスが表示された後タイムアウトになります。このレスポンスの後方にある6つの数字は、PASVモードで接続する際に使用するIPアドレスとポート番号を表しています。RFC959を見てみると次のように説明されています。

DATA PORT (PORT)

The argument is a HOST-PORT specification for the data port
to be used in data connection. There are defaults for both
the user and server data ports, and under normal
circumstances this command and its reply are not needed. If
this command is used, the argument is the concatenation of a
32-bit internet host address and a 16-bit TCP port address.
This address information is broken into 8-bit fields and the
value of each field is transmitted as a decimal number (in
character string representation). The fields are separated
by commas. A port command would be:

PORT h1,h2,h3,h4,p1,p2

where h1 is the high order 8 bits of the internet host
address.

つまり、(192,168,7,129,169,115)という6つ組の数字は、「PASV接続する時は、192.168.7.129:43379に接続してください」という意味になっています。

ですが、192.168.7.129というのは、NAT内でのIPアドレスなので、NATの外から直接接続することはできません。本来であれば、192.168.7.1と表示されてほしいはず。192.168.7.1にアクセスした後に192.168.7.129にパケットが転送されてくれないと困るため、routerに対してrouterが着信した通信を転送する設定(Port forwarding)を入れる必要もありそうです。また、問題文からserverにもiptablesの設定が入っていそうなので、その設定も追記をする必要があるかもしれません。

まず始めに、serverの/etc/vsftpd.confに以下の設定をします。詳しい設定の意味は、こちらを確認すると良いです。ざっくり説明すると「vsftpdはスタンドアロンで動作し、IPv4からの接続を受け付ける。また、PASV接続の際には192.168.7.1の60001~60025番ポートを使用する」という意味になります。この設定を入れたあとは、vsftpdを再起動してください(sudo systemctl restart vsftpd)。

- LISTEN=NO
+ LISTEN=YES
- LISTEN_IPv6=YES
+ LISTEN_IPv6=NO
...
+ pasv_address=192.168.7.1
+ pasv_min_port=60001
+ pasv_max_port=60025

この次に、serverのiptablesの設定を確認してみましょう。

$ sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- anywhere anywhere tcp spt:ftp-data /* DON'T REMOVE IT. */ reject-with icmp-port-unreachable

今回、60001番から60025番ポートをFTP用に使おうとしているので、それを許可する設定を入れる必要があります。

$ sudo iptables -A INPUT -p tcp --dport 60001:60025 -j ACCEPT

最後にrouterのPort forwardingの設定を確認してみましょう。

$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere router tcp dpt:ftp to:192.168.7.129
DNAT tcp -- anywhere router tcp dpt:ssh to:192.168.7.129

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.7.128/25 anywhere

先程と同様に、60001番から60025番ポートを転送するような設定を入れる必要があります。

$ sudo iptables -t nat -A PREROUTING --dst 192.168.7.1 -p tcp --dport 60001:60025 -j DNAT --to 192.168.7.129

ここまで設定を入れると、次のようにPASVモードで接続できていることが分かります。

ftp 192.168.7.1
Connected to 192.168.7.1.
220 (vsFTPd 3.0.3)
Name (192.168.7.1:root): admin
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pass
Passive mode on.
ftp> ls
227 Entering Passive Mode (192,168,7,1,234,102).
150 Here comes the directory listing.
226 Directory send OK.
ftp>

想定解法

  • serverの/etc/vsftpd.confに以下の設定を入れた。
- LISTEN=NO
+ LISTEN=YES
- LISTEN_IPv6=YES
+ LISTEN_IPv6=NO
...
+ pasv_address=192.168.7.1
+ pasv_min_port=60001
+ pasv_max_port=60025
  • serverのiptablesに以下の設定を入れた。
sudo iptables -A INPUT -p tcp --dport 60001:60025 -j ACCEPT
  • routerのiptablesに以下の設定を入れた。
sudo iptables -t nat -A PREROUTING --dst 192.168.7.1 -p tcp --dport 60001:60025 -j DNAT --to 192.168.7.129

講評

解答率はだいたい30%くらいでもうちょっと解いてくれる人多いかなと期待してました。作問者自身も中学生とかの頃はよく使っていましたが、最近はsftpで済ませてしまうことがほとんどなので、最近触れる人は意外とFTPを使ったことがないのかもしれないと考えています。

この問題は想定解法以外にもいくつかの解法があります。想定解法ではPASVモードで接続するようにしているのですが、ACTIVEモードで接続するのもこの問題のゴールである「手元PCから192.168.7.1で接続し、ディレクトリ一覧を取得できるようにしてください。」を満たしているため正解としています。中には、ip_conntrack_ftpip_nat_ftpを用いた解法もありましたが、基本的に使っても接続できるようにはならないはずです。想定解法以外の解法についてはいつかどこかで説明できたらなと思っています。

 /

問題文

MSPに管理を依頼している踏み台サーバから中にあるアプリケーションサーバに、公開鍵認証でログインできなくなってしまった。君たちの手元からアプリケーションサーバには疎通がなく、踏み台サーバーを経由してsshを行う必要がある。困ったことに、アプリケーションサーバのsshd_configにはパスワード認証を許可する設定がされていない。

どうやらログインできなくなる前が新入社員が踏み台サーバーでなんらかの作業を行っていたらしい、なんとかしてアプリケーションサーバにログインできるようにしてほしい。

社内ではログイン方法がマニュアル化されているため、かならず下記コマンドでログインができるようにしてほしい

ちなみに、管理を依頼している会社は怠け者集団で月曜日までは対応ができないとのことだ。

情報

踏み台サーバ (wow_bastion)

IPアドレス: 192.168.6.1 (踏み台), 192.168.6.129 (アプリケーションネットワーク) ユーザー: admin  パスワード: n0stack/n0stack

アプリケーションサーバ (wow_target)

IPアドレス: 192.168.6.130 ユーザー: admin  パスワード: なし (公開鍵認証)

目標サーバのadminユーザーには、 踏み台サーバの /home/admin/.ssh/id_ecdsa に対応する公開鍵が設置されている。

トラブルの概要

公開鍵認証を用いたsshを行うとき、ローカルの同名ファイル(id_ecdsaとid_ecdsa.pubなど)がキーペアになってない場合に、認証がスキップされてログインできない問題。

解説

この問題は、踏み台サーバから公開鍵認証を用いたsshログインができなくなるトラブルです。

LinuxのSSHクライアントから公開鍵認証で接続する際は、 -i で公開鍵を選択するか、 ~/.ssh の配下にあるファイルが読み込まれます。 ファイルが読み込まれた際に、秘密鍵の名前に加えて .pub がついたファイルが存在していた場合、そのファイルが秘密鍵とペアである公開鍵かのチェックが行われ、一致しなかった場合はログインが出来ないという問題があります。 また、この問題は .pub ファイルが存在しない場合には行われず、接続に成功します。

踏み台サーバの作業履歴をみるとホームディレクトリのtarballが展開されて、公開鍵が上書きされていることがわかります。

想定回答としては、ssh-keygen コマンドを用いて秘密鍵から公開鍵を再生成する事を想定しています。 ssh-keygen -y -f ~/.ssh/id_ecdsa > ~/.ssh/id_ecdsa.pub

それ以外にも、 .pub ファイルが存在しない場合に接続が成功することがあるため、当該ファイルを削除しても解決可能ですが、この問題の場合は一部減点をしています。 rm ~/.ssh/id_ecdsa.pub

回答例

お疲れ様です。解答を提出いたします。

ssh admin@192.168.6.130 -vvv で踏み台のid_ecdsaのオファーが途中でスキップされていることを確認しました。

history で ~/pubkey.tar.gz が展開された形跡があることを確認しました。

ssh-keygen -l -f ~/.ssh/id_ecdsa ssh-keygen -l -f ~/.ssh/id_ecdsa.pub でこの2つのファイルがキーペアになっていないことを確認しました。

mv ~/.ssh/id_ecdsa.pub ~/.ssh/id_ecdsa.pub.old のようなコマンドで展開された公開鍵のバックアップを取りました。

ssh-keygen -yf ~/.ssh/id_ecdsa > ~/.ssh/id_ecdsa.pub でキーペアになる公開鍵を生成しました。

ssh admin@192.168.6.130 でログインできることを確認しました。

採点基準

/home/admin/.ssh 内に配置されている id_ecdsa と id_ecdsa.pub がキーペアでなくなっていることに気づく: 50%

目標サーバに /home/admin/.ssh/id_ecdsa を用いでログインができる 100%

/home/admin/.ssh/id_ecdsa から公開鍵を生成していない場合は減点