2023 トラコン 踏み台サーバ >ssh user@team17.bastion.ictsc.net -p 22 >!hYY/asCgwyH <a id="top"></a> | 問題 | 担当 | ポイント | | -------- | -------- | -------- | | [奴の名は](#1) | Text | Text | | [IPv6のDHCP](#2) | 回答済み | Text | | [protocが... 見つからない!?](#3) | Text | Text | | 盲点の窓 | Text | Text | | データベースに入れない! | Text | Text | | [俺はインターネットの一員になるんだ!](#6) | Text | Text | | [俺自身がDHCPサーバーとなることだ](#8) | 佐藤 | Text | | 魔王様の求人 | Text | Text | | [オレオレS3](#7) | 林 | 100 | | たかし先輩のK8s作問 | Text | Text | | トラブルシューターの初仕事 | Text | Text | | Beer | Text | Text | | ストレージ消し飛んだ... | Text | Text | | [pingが飛ばない](#14) | 回答済み | 50 | | [答えてくれPingサーバー、ここにはuserモードとsystemdと、俺がいる!](#15) | 回答済み | 150 | | Welcome to ICTSC! | Text |Text | | [やらかしたかもしれない...](#17) | 回答済み | 100 | 回答 テンプレ ```回答 お世話になっております。チーム名どうします?です。 この問題では、原因でトラブルが発生したと考えられました。 そのため、以下のように設定を変更し、が正しく動くことを確認いたしました。 確認のほどよろしくお願いいたします。 ``` 問題 <a id="1"></a> 1. 奴の名は [TOP](#top) 概要 会社のアカウント管理にLDAPを利用しようとしています。 同僚が「LDAPサーバーを構築したのにsshできないよ〜」と言っているので、助けてあげましょう。 前提条件 Ubuntu 22.04の環境で、LDAPサーバーが構築されている。 > aliceというユーザーがLDAPに存在するが、sshやsuができない。 LDAPに保存してあるaliecユーザー情報を編集する必要はない。 LDAPサーバーとLDAPを利用するクライアントは通常別々のマシンだが、今回は簡易化のために一緒にしました。この構成に特に意味はない。 注意事項 LDAP(OpenLDAP)以外を用いて問題を解決してはいけない。(ローカルアカウントを作る、など) 既存のLDAPサーバーを修正すること。つまりDockerや仮想マシンで別途新しいOpenLDAPデーモンを実行したり外部のLDAPを利用してはいけない。 ただトラブルシューティングの作業内容を解答するだけではなく、何が原因だったのかを解答に含めること。「xxの設定をコピペしてきたら治った」「xxを実行したら治った」だけでは減点とする。 初期状態 ssh alice@localhostを実行してもsshができない 終了状態 ssh alice@localhostを実行するとログインができてシェルが出てくる --- <a id="2"></a> 2. IPv6のDHCP [TOP](#top) 概要 >トラコン大学のすぐる先生は、ネットワークの授業でIPv6のDHCPをパケットキャプチャして見せたいと考えました。 ルーターOSではなく使い慣れたLinux 環境で行いたいと考えfrrを選定しました。 しかし、すぐる先生はfrrを触ったことがありません。 さらに、すぐる先生は学会で忙しいため、ゼミ生であるあなたに手順を調べてほしいとお願いしてきました。 DHCPの方法は、SLAAC・DHCPv6どちらでも構わないそうです。 ホスト dhcp-serverにfrrをインストールして、clientにIPv6アドレスを配布してあげて疎通確認できる状態までしてください。 アドレスレンジはは2001:db8::/64を使用してください。 dhcp-serverとclientのアドレス、手順を報告すること。 ``` 初期状態 IPv6が何も設定されていない 終了状態 dhcp-serverがdhcpでclientにipを配布し、pingを送ることができる ``` ### log * DHCPサーバー,clientはubuntu22.04LTS * [とりあえずインストールしてみる](https://docs.frrouting.org/projects/dev-guide/en/latest/building-frr-for-ubuntu2004.html?highlight=install#install-service-files) * `/usr/bin/sudo /usr/bin/vtysh`でrouterの中に入れる * 設定は[インストールサイト](https://docs.frrouting.org/projects/dev-guide/en/latest/building-frr-for-ubuntu2004.html?highlight=install#install-service-files)のまま * 触ったファイル`/etc/frr/frr.cpnfig`,`/etc/module-load-d/modules.conf`,`/etc/frr/daemons` * modules.conf->+mpls_router mpls_iptunnel 手順 1. sudo apt update `sudo apt-get install \ git autoconf automake libtool make libreadline-dev texinfo \ pkg-config libpam0g-dev libjson-c-dev bison flex \ libc-ares-dev python3-dev python3-sphinx \ install-info build-essential libsnmp-dev perl \ libcap-dev python2 libelf-dev libunwind-dev` 2. `curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py sudo python2 ./get-pip.py` pip2 --version 3. git clone https://github.com/CESNET/libyang.git ```shell= cd libyang git checkout v2.0.0 mkdir build; cd build cmake -D CMAKE_INSTALL_PREFIX:PATH=/usr \ -D CMAKE_BUILD_TYPE:String="Release" .. make sudo make install ``` 4. sudo apt-get install protobuf-c-compiler libprotobuf-c-dev 5. sudo apt-get install libzmq5 libzmq3-dev 6. sudo groupadd -r -g 92 frr ```shell= sudo groupadd -r -g 85 frrvty sudo adduser --system --ingroup frr --home /var/run/frr/ \ --gecos "FRR suite" --shell /sbin/nologin frr sudo usermod -a -G frrvty frr ``` 7. git clone https://github.com/frrouting/frr.git frr >cd frr ./bootstrap.sh ./configure \ --prefix=/usr \ --includedir=\${prefix}/include \ --bindir=\${prefix}/bin \ --sbindir=\${prefix}/lib/frr \ --libdir=\${prefix}/lib/frr \ --libexecdir=\${prefix}/lib/frr \ --localstatedir=/var/run/frr \ --sysconfdir=/etc/frr \ --with-moduledir=\${prefix}/lib/frr/modules \ --with-libyang-pluginsdir=\${prefix}/lib/frr/libyang_plugins \ --enable-configfile-mask=0640 \ --enable-logfile-mask=0640 \ --enable-snmp=agentx \ --enable-multipath=64 \ --enable-user=frr \ --enable-group=frr \ --enable-vty-group=frrvty \ --with-pkg-git-version \ --with-pkg-extra-version=-MyOwnFRRVersion make sudo make install 8. sudo install -m 775 -o frr -g frr -d /var/log/frr >sudo install -m 775 -o frr -g frrvty -d /etc/frr sudo install -m 640 -o frr -g frrvty tools/etc/frr/vtysh.conf /etc/frr/vtysh.conf sudo install -m 640 -o frr -g frr tools/etc/frr/frr.conf /etc/frr/frr.conf sudo install -m 640 -o frr -g frr tools/etc/frr/daemons.conf /etc/frr/daemons.conf sudo install -m 640 -o frr -g frr tools/etc/frr/daemons /etc/frr/daemons 9. Edit /etc/sysctl.conf >net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1 11. /etc/modules-load.d/modules.confに追記 >mpls_router mpls_iptunnel 12. sudo modprobe mpls-router mpls-iptunnel 13. Edit /etc/sysctl.conf >net.mpls.conf.eth0.input=1 net.mpls.conf.eth1.input=1 net.mpls.conf.eth2.input=1 net.mpls.platform_labels=100000 14. sudo install -m 644 tools/frr.service /etc/systemd/system/frr.service >sudo systemctl enable frr 15. systemctl start frr 16. sudo cat /etc/frr/daemons >zebra=no bgpd=no ospfd=no ospf6d=no ripd=no ripngd=no isisd=no pimd=no ldpd=no nhrpd=no eigrpd=no babeld=no sharpd=no staticd=no pbrd=no bfdd=no fabricd=no # If this option is set the /etc/init.d/frr script automatically loads # the config via "vtysh -b" when the servers are started. # Check /etc/pam.d/frr if you intend to use "vtysh"! # vtysh_enable=yes zebra_options=" -s 90000000 --daemon -A 127.0.0.1" bgpd_options=" --daemon -A 127.0.0.1" ospfd_options=" --daemon -A 127.0.0.1" ospf6d_options=" --daemon -A ::1" ripd_options=" --daemon -A 127.0.0.1" ripngd_options=" --daemon -A ::1" isisd_options=" --daemon -A 127.0.0.1" pimd_options=" --daemon -A 127.0.0.1" ldpd_options=" --daemon -A 127.0.0.1" nhrpd_options=" --daemon -A 127.0.0.1" eigrpd_options=" --daemon -A 127.0.0.1" babeld_options=" --daemon -A 127.0.0.1" sharpd_options=" --daemon -A 127.0.0.1" staticd_options=" --daemon -A 127.0.0.1" pbrd_options=" --daemon -A 127.0.0.1" bfdd_options=" --daemon -A 127.0.0.1" fabricd_options=" --daemon -A 127.0.0.1" #MAX_FDS=1024 The list of daemons to watch is automatically generated by the init script. #watchfrr_options="" for debugging purposes, you can specify a "wrap" command to start instead of starting the daemon directly, e.g. to use valgrind on ospfd: ospfd_wrap="/usr/bin/valgrind" or you can use "all_wrap" for all daemons, e.g. to use perf record: all_wrap="/usr/bin/perf record --call-graph -" the normal daemon command is added to this at the end. frrに入る(host) `/usr/bin/sudo /usr/bin/vtysh` >enable conf t interface eth0 no ipv6 nd suppress-ra ipv6 nd prefix 2001:db8::/64 --- ### クライアント dhcpv6受け取り設定 変更前 >vi /etc/netplan/01-netcfg.yaml ```shell root@client:/etc/netplan# cat 01-netcfg.yaml network: ethernets: eth0: addresses: - 192.168.6.2/24 dhcp4: 'no' dhcp6: 'no' routes: - to: 0.0.0.0/0 via: 192.168.6.254 nameservers: addresses: - 210.188.224.10 - 210.188.224.11 search: - localdomain renderer: networkd version: 2 ``` 変更後 ```shell root@client:/etc/netplan# vi 01-netcfg.yaml network: ethernets: eth0: addresses: - 192.168.6.2/24 dhcp4: 'no' dhcp6: 'yes' routes: - to: 0.0.0.0/0 via: 192.168.6.254 nameservers: addresses: - 210.188.224.10 - 210.188.224.11 search: - localdomain renderer: networkd version: 2 ``` 有効化 >`netplan apply` 確認 >ip a ```shell 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 9c:a3:ba:32:ca:a0 brd ff:ff:ff:ff:ff:ff altname enp0s3 altname ens3 inet 192.168.6.2/24 brd 192.168.6.255 scope global eth0 valid_lft forever preferred_lft forever inet6 2001:db8::9ea3:baff:fe32:caa0/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 2591814sec preferred_lft 604614sec inet6 fe80::9ea3:baff:fe32:caa0/64 scope link valid_lft forever preferred_lft forever ``` --- <a id="3"></a> 3. protocが... 見つからない!? [TOP](#top) >概要 あなたは現在、プログラミングサークルのPaaS基盤の開発に勤しんでいます。このPaaSでは、Dockerfileを用いてイメージをビルドし、そのイメージを動かすことができます。 さて、ここで共同開発している先輩がサンプルアプリケーションを作ってくれました。GoとgRPCを使ったシンプルなPingサーバーで、先輩からは「Protocol Buffersのビルド環境の公式イメージが無いから、ちゃちゃっと作ってくれん?ついでにGoも入ってると嬉しいわ」と言われてしまいました。 builderイメージの作成はスムーズに行っているように思われましたが、試しに輩の作ってくれたDockerfileをビルドしてみたところ... 「/bin/sh: protoc: not found」 protocが... 見つからない!? ``` 前提条件 禁止されるアクション 先輩が用意した (/home/user/app ディレクトリ内にある) ファイルの変更 デプロイスクリプト (/home/user/deploy ファイル) の変更 Protocol Buffersならびに使用するベースイメージの、公式ソース以外からの取得 builderイメージへの、ローカルからのファイルのコピー (--from タグを指定しないCOPYコマンドや、Volumeによるマウントの使用) 最新版 (v22.0 / v3.22.0) 以外のProtocol Buffersの使用 その他 共同開発している先輩には知見を共有する必要があるので、先輩が納得するように今回のトラブルの原因を説明してください 先輩はある程度Docker、Linux、Protocol Buffersに関する知識があるという前提でOKです 初期状態 /home/user/deploy を実行すると、ビルド中に /bin/sh: protoc: not found エラーが出て終了する 終了状態 /home/user/deploy を実行した時、 Protocol BuffersとGoのビルドができる汎用イメージである、builder:v1 イメージがビルドされ、docker image ls で閲覧できるリスト上に出る 上記イメージを使用した先輩のアプリケーションのDockerビルドとコンテナの起動が正常に完了する localhost:8080 上に先輩の作ったgRPCサーバーが立つ web-serverホスト上にて grpcurl -plaintext :8080 app.protobuf.PingService/Ping を実行し、以下のレスポンスが返ってくるなどで確認できる このコマンド実行のためには別途grpcurlのダウンロードが必要 { "message": "Hello, ICTSC2022 Contestant!" } ``` --- <a id="7"></a> 7. オレオレS3 [TOP](#top) 概要 nginxのログをfluentdで管理したいと思っています。 fluentdのバックエンドとして、S3互換であるオブジェクトストレージminioを構築しました。 しかし、うまく接続することができません。 前提条件 nginxの設定を変えてはいけない vm2にはsshできない fluentd,とminio以外のツールを用いて問題を解決してはならない 他のオブジェクトストレージをインストールするなど minioではなくクラウドサービス(AWS S3など)を利用するなど 初期状態 curl localhostを実行すると、fluentdに以下のようにエラーが出る。 /var/log/td-agent/td-agent.log 2023-03-01 03:11:29 +0900 [error]: #0 unexpected error error_class=RuntimeError error="can't call S3 API. Please check your credentials or s3_region configuration. error = #<Seahorse::Client::NetworkingError: Failed to open TCP connection to test.192.168.19.2:9000 (getaddrinfo: Name or service not known)>" 終了状態 fluentdでログを収集できる。つまり以下を閲覧してもエラーメッセージが出てない。 /var/log/td-agent/td-agent.log また、awscliコマンドなど何らかの方法でminioにリクエストを飛ばして、ログが保存されていることを確認できる。 ```shell $ sudo apt install awscli $ aws configure --profile minio AWS Access Key ID [None]: saJ4MVuD7lcFdDnq AWS Secret Access Key [None]: bbrT3KuHRKebkvADOBYNH2w73Jgmt72C Default region name [None]: ap-northeast-1 Default output format [None]: $ aws --profile minio --endpoint-url http://192.168.19.2:9000 s3 ls --recursive s3://test/ 2023-03-01 03:36:37 129 logs/2023/03/01_0.gz 2023-03-01 03:37:43 127 logs/2023/03/01_1.gz 2023-03-01 03:41:29 162 logs/2023/03/01_2.gz 2023-03-01 03:45:13 168 logs/2023/03/01_3.gz ``` ### log Fluentdのconfigファイルを確認 >cat /etc/td-agent/td-agent.conf ```shell= <source> @type tail path /var/log/nginx/access.log pos_file /var/log/td-agent/nginx_access.log.pos <parse> @type nginx </parse> tag nginx.access </source> <match nginx.**> @type s3 aws_key_id saJ4MVuD7lcFdDnq aws_sec_key bbrT3KuHRKebkvADOBYNH2w73Jgmt72C s3_bucket test s3_endpoint http://192.168.19.2:9000 s3_region ap-northeast-1 path logs/ time_slice_format %Y/%m/%d <buffer tag,time> @type file path /var/log/td-agent/s3 flush_mode interval flush_interval 1m </buffer> </match> ``` <a id="8"></a> 8. 俺自身がDHCPサーバーとなることだ [TOP](#top) >概要 中古のマシン(計算機X)を購入したので、早速環境構築だ! って思ったがまともに稼働しているインターフェイスがなく、唯一8P8CジャックのあるNICだけが動作していた! 購入時についてきた元オーナーの手紙を読むと、どうやらそのインターフェイスでsshdとdhcpv4クライアントサービスが稼働しているとのこと。 あいにく、現在使用中のL2スイッチには空きポートがない。 代わりに直接ホストマシンとそのマシンをLANケーブルをつないだので、ホストマシン自身がDHCPサーバーとなってその計算機にIPアドレスを割り振り、その計算機上で作業をできるようにしよう。 DHCPサーバーのサービスにはisc-dhcp-serverなどがある。 * 前提条件 ホストマシン(wsmhost)の外部へのインターフェイス(eth1)はdhcpを用いたネットワーク設定であること。 ホストマシンの再起動後、計算機Xとの疎通ができなくても良い 計算機Xから外のインターネットへの通信はできなくても良い * 初期状態 計算機Xにipアドレスが割り当てられていない。 * 終了状態 計算機Xにipアドレスが割り当てられており、疎通ができる。 この状態の永続化は求めない。(再起動して、計算機Xとの疎通ができなくなってもよい) ### log * hostのIPアドレス eth0:10.0.0.1,eth1:192.168.12.128 * Server情報 Ubuntu20.04LTS * /etc/dhcp/dhcpd.confの中身 ``` subnet 10.0.0.0 netmask 255.255.255.0 { range 10.0.0.128 10.0.0.254; option routers 10.0.0.1; option subnet-mask 255.255.255.0; option broadcast-address 10.0.0.255; default-lease-time 600; max-lease-time 7200; } 権限付与 >cd /lib/systemd/system >chmod +x isc-dhcp-server >chmod +x isc-dhcp-server6 ``` <a id="6"></a> 7. 俺はインターネットの一員になるんだ! [TOP](#top) >概要 「俺はインターネットの一員になるんだ!」 そう決心した黒羽くんはAS番号を取得し、とある組織にトランジット提供を依頼した。 トランジット先とは、IPv6閉域網の網内折り返し通信を用いてトンネル接続を行い、トンネル内でBGP接続を行うこととなった。 黒羽くんは熱意が冷めないうちに早速トンネル接続の設定を行い、トランジット先の対向ルーターとの疎通が確認できた。 「俺ももうすぐインターネットの一員だ!」 さらに意気込んだ黒羽くんは続けてBGPの設定を行った。 「俺もこれでインターネットの一員になったんだ」と、黒羽くんは感慨に浸っている。 黒羽くんは最後に接続確認を行った。 「あれ?インターネットに接続できない… しかも、いつの間にか対向ルーターまでpingが通らなくなってる…」 黒羽くんは塞ぎ込んでしまった。 相談に乗ろうにも、ルーターのログイン情報以外については「いい感じに調べて」としか言ってくれない。 なんとかして接続の問題を解消してほしい。 * 前提条件 障害発生までの経緯は概要のとおり 操作可能な端末はPCとRouterの2つである Routerで適切な設定を行うことで本トラブルは解決する 対向ルーターとの接続に用いるIPv6閉域網では障害は発生していない 対向ルーターは適切に設定されている * 制約 以下の情報は既存の設定に従う BGPで広報する経路 BGPで受信する経路 その他接続に必要な情報 スタティックルートを新たに設定してはならない * 初期状態 対向ルーターのトンネル終端アドレスとpingによる通信ができない トンネル内で対向ルーターとpingによる通信ができない PC, Routerから198.51.100.1 とpingによる通信ができない PC, Routerから2001:db8:2718:2818::1 とpingによる通信ができない * 終了状態 対向ルーターとの BGP state が Established となっている 対向ルーターから経路を受け取っている 対向ルーターのトンネル終端アドレスとpingによる通信ができる トンネル内で対向ルーターとpingによる通信ができる PC, Routerから198.51.100.1 とpingによる通信ができる PC, Routerから2001:db8:2718:2818::1 とpingによる通信ができる ### log 問題コンテナとOS >Router:Vyos,PC:Ubuntu20.04.1LTS Routerの初期設定 ``` user@Router:~$ show interfaces { ethernet eth0 { address 192.168.3.1/24 hw-id 9c:a3:ba:32:d5:fa } ethernet eth1 { address 2001:db8:cafe:babe::beef/64 hw-id 9c:a3:ba:32:00:6c } ethernet eth2 { address 203.0.113.1/24 address 2001:db8:314:1592::1/64 hw-id 9c:a3:ba:32:a2:ee } loopback lo { } tunnel tun1 { address 192.0.2.1/31 address 2001:db8:face:babe::ffff/64 encapsulation ip6gre remote 2001:db8:cafe:f00d::beef source-address 2001:db8:cafe:babe::beef } } protocols { bgp { address-family { ipv4-unicast { network 203.0.113.0/24 { } } ipv6-unicast { network 2001:db8:314:1500::/56 { } } } neighbor 192.0.2.0 { address-family { ipv4-unicast { } } remote-as 64512 } neighbor 2001:db8:face:babe::1 { address-family { ipv6-unicast { } } remote-as 64512 } system-as 65280 } static { route 192.168.0.0/16 { next-hop 192.168.3.254 { } } route6 ::/0 { next-hop 2001:db8:cafe:babe::1 { } } } } service { ssh { } } system { config-management { commit-revisions 0 } conntrack { modules { ftp h323 nfs pptp sip sqlnet tftp } } console { device ttyS0 { speed 115200 } } host-name Router login { user ictsc { authentication { encrypted-password $6$xv6goheAI4zvW.aw$GPeyFTCB0vNxoPEU9CRHQp.O99YIMj0dXXzVqWDHYp.xUcDxC9Z7zMRgThF4xWurbsED5QzDhEeqv3YvjJYbF/ public-keys default { key AAAAC3NzaC1lZDI1NTE5AAAAIEVbqhVuUEE+LdcvCKvoReDh2yDbV8T6p5dyDwDNqh2D type ssh-ed25519 } } } user user { authentication { encrypted-password $6$deiHWtwpUbBRcCNY$b.qxulJ6BVFLWTVyfVCDhGnVx0JhnGdh427SL9vCLIur1v/s0m8vqD.HX.wIxHHqQkUqW.OsDi1GZnZ7i7PhS1 public-keys ictsc2022-user { key AAAAC3NzaC1lZDI1NTE5AAAAIEN6KHc7DmIFG66ywUd4pn+UNt73UVdURFoL+Ra7tOMd type ssh-ed25519 } } } } ntp { server time1.vyos.net { } server time2.vyos.net { } server time3.vyos.net { } } option { keyboard-layout jp106 } syslog { global { facility all { level info } facility protocols { level debug } } } time-zone Asia/Tokyo } ``` --- <a id="14"></a> 14. pingが飛ばない [TOP](#top) >Host01からHost02へのpingが飛びません。 ルーティング情報とかファイヤウォールは間違ってないと思うんですが・・・ 前提条件 Host01,Routerの既存の設定を削除してはならない 初期状態 Host01からHost02へのpingができない 終了状態 Host01からHost02へのpingができ、疎通ができる Host01, Router を再起動しても、終了状態が維持される ### log * vyosのコマンド * ip interfaces:ipアドレス表示 * firewallに問題あり? * eth1-outにはTCPのみ許可 コマンド:set firewall name 名前 rule 番号 set firewall interface ... <a id="15"></a> 15. 答えてくれPingサーバー、ここにはuserモードとsystemdと、俺がいる! [TOP](#top) >概要 あなたが所属しているプログラミングサークルでは、Webサービスの作成を支援するため、サークルで共用のサーバーを借りて、1人1アカウントずつ割り当てて自由にサービスをデプロイできるようにしている。もちろんsudoは使えない。 あなたもGoで作ったWebアプリケーションをデプロイしたいと思ったが、定期メンテナンスで再起動されるたびに毎回アプリケーションを起動し直すのは骨が折れる。何かいい策が無いかとネットを漁ってみたが、「systemd」ってやつは管理者権限が無いと使えないらしい。管理者の先輩にアドバイスを求めたところ、「userモードのsystemdは再起動の度に起動するように設定してあるよ」とのことなので、userモードのsystemdを使ってみることにした。 実験用に作ったアプリケーションをサーバーに移しデプロイコマンドを実行して、次の定期メンテナンスを楽しみに待っていた...が。 アプリケーションが起動していない!なんで!? >前提条件 回答の中で許可されるアクション /home/user/webapp ディレクトリ内のファイルの変更 /home/user/webapp/deploy ファイルの実行 回答として許可されない解決方法 userモードのsystemd (systemctl --user で操作できる範囲) 以外での自動起動の実現 その他 再起動のシミュレートのため、問題環境上では sudo コマンドを許可してありますが、回答の中では使えません かわいい後輩たちのために、なぜ動いていなかったのか、原因の特定・報告をしっかりと行ってください >初期状態 web-serverにログインして curl localhost:8080/ping を実行すると「Hello, ICTSC2022 Contestant!」の文字列が返ってくる sudo reboot でweb-serverを再起動してからweb-serverにログインして curl localhost:8080/ping を実行すると「Connection refused」というエラーが出る 終了状態 web-serverにログインして curl localhost:8080/ping を実行すると「Hello, ICTSC2022 Contestant!」の文字列が返ってくる sudo reboot でweb-serverを再起動してからweb-serverにログインして curl localhost:8080/ping を実行しても「Hello, ICTSC2022 Contestant!」の文字列が返ってくる ### log systemctl --user 確認 >systemctl --user status ● web-server State: running Jobs: 0 queued Failed: 0 units Since: Sat 2023-03-04 05:09:21 JST; 7h ago CGroup: /user.slice/user-1002.slice/user@1002.service ├─app.slice │ └─webapp.service │ └─1298 /home/user/webapp/main └─init.scope ├─609 /lib/systemd/systemd --user └─612 (sd-pam) systemctl --user がちゃんと起動しているか確認 >user@web-server:~$ systemctl --user show-environment HOME=/home/user LANG=en_US.UTF-8 LANGUAGE=en_US.UTF-8 LOGNAME=user PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin SHELL=/bin/bash SYSTEMD_EXEC_PID=609 USER=user XDG_RUNTIME_DIR=/run/user/1002 QT_ACCESSIBILITY=1 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1002/bus ユーザーのインスタンスを自動起動 >loginctl enable-linger user 運営が初期で設定した内容を確認 >user@web-server:~$ systemctl --user list-dependencies default.target ● └─basic.target ● ├─paths.target ● ├─sockets.target ● │ ├─dbus.socket ● │ ├─dirmngr.socket ● │ ├─gpg-agent-browser.socket ● │ ├─gpg-agent-extra.socket ● │ ├─gpg-agent-ssh.socket ● │ ├─gpg-agent.socket ● │ └─pk-debconf-helper.socket ● └─timers.target サービスのファイルの場所確認 >~/.config/systemd/user/webapp.service 中身確認 ```shell user@web-server:~/.config/systemd/user$ cat webapp.service [Unit] Description=ICTSC2022 simple webapp After=network.target [Service] Restart=always ExecStart=/home/user/webapp/main [Install] WantedBy=multi-user.target ``` 実行できることを確認 ```shell user@web-server:~/.config/systemd/user$ systemctl --user start webapp.service user@web-server:~/.config/systemd/user$ systemctl --user status webapp.service ``` >enable起動を設定後 reboot ```shell user@web-server:~/.config/systemd/user$ systemctl --user enable webapp.service Created symlink /home/user/.config/systemd/user/multi-user.target.wants/webapp.service → /home/user/webapp/webapp.service. Unit /home/user/webapp/webapp.service is added as a dependency to a non-existent unit multi-user.target. sudo reboot ``` だめだった statusを確認すると deadになっている >user@web-server:~$ systemctl --user status webapp.service ○ webapp.service - ICTSC2022 simple webapp Loaded: loaded (/home/user/.config/systemd/user/webapp.service; enabled; vendor preset: enabled) Active: inactive (dead) list-dependenciesで、実行ツリーにサービスが含まれているかどうかを確認する >systemctl --user list-dependencies default.target ● └─basic.target ● ├─paths.target ● ├─sockets.target ● │ ├─dbus.socket ● │ ├─dirmngr.socket ● │ ├─gpg-agent-browser.socket ● │ ├─gpg-agent-extra.socket ● │ ├─gpg-agent-ssh.socket ● │ ├─gpg-agent.socket ● │ └─pk-debconf-helper.socket ● └─timers.target 確認できた 実行結果を確認 >journalctl --user -xeu <サービス名>.service 確認すると、エラーが出ていない起動だけができていない だが設定は反映されていた ``` user@web-server:~$ systemctl --user is-enabled webapp.service enabled ``` ツリーを確認したときに、enableになっているが追加はされていない >systemctl --user list-dependencies デーモンをリロードしてみる >systemctl --user daemon-reload deployの中にコマンドが実装されているが、実行されていない権限の問題でもないため、別のところで障害が起こっている ```shell user@web-server:~/webapp$ cat deploy #!/bin/sh go build -o main main.go systemctl --user daemon-reload systemctl --user restart webapp ``` 依存関係を確認 >systemctl --user list-dependencies ```shell user@web-server:~/webapp$ systemctl --user list-unit-files -all UNIT FILE STATE VENDOR PRESET at-spi-dbus-bus.service static - dbus.service static - dconf.service static - dirmngr.service static - emacs.service disabled enabled gpg-agent.service static - pk-debconf-helper.service static - session-migration.service enabled enabled ssh-agent.service static - systemd-exit.service static - systemd-tmpfiles-clean.service static - systemd-tmpfiles-setup.service disabled enabled webapp.service enabled enabled ここに存在はしているが 有効かされていない ``` シンボリックリンクの作成時の挙動がおかしい >Created symlink /home/user/.config/systemd/user/multi-user.target.wants/webapp.service → /home/user/webapp/webapp.service. Unit /home/user/webapp/webapp.service is added as a dependency to a non-existent unit multi-user.target. sudo reboot 似たような記事を参照 https://github.com/containers/podman/issues/12438 ```shell [Unit] Description=ICTSC2022 simple webapp After=network.target [Service] Restart=always ExecStart=/home/user/webapp/main [Install] //WantedBy=multi_user.target WantedBy=default.target ``` 自動起動設定 >systemctl --user enable --now webapp.service ```shell user@web-server:~/webapp$ systemctl --user enable --now webapp.service Created symlink /home/user/.config/systemd/user/default.target.wants/webapp.service → /home/user/webapp/webapp.service. ``` 説明用 default.target確認 ```shell user@web-server:~/.config/systemd/user/default.target.wants$ ls -l total 0 lrwxrwxrwx 1 user user 32 Mar 4 15:16 webapp.service -> /home/user/webapp/webapp.service ``` >デフォルト確認 ```shell= user@web-server:/lib/systemd$ systemctl --user get-default default.target ``` set-default一覧 ```shell= user@web-server:~$ systemctl --user set-default basic.target exit.target paths.target smartcard.target timers.target bluetooth.target graphical-session-pre.target printer.target sockets.target xdg-desktop-autostart.target default.target graphical-session.target shutdown.target sound.target ``` --- <a id="17"></a> 17. やらかしたかもしれない... [TOP](#top) >概要 原因はわからないが、userでsudo suを実行した後にcd /ができなくなったらしい。 どうにかしてcd /を実行できるようにし、原因を教えてほしい。 ```markdon= 前提条件 初期状態 userでsudo suを実行した後にcd /が実行できない 終了状態 userでsudo suを実行した後にcd /が実行できる ``` >uname -a >Linux host01 5.15.0-58-generic #64-Ubuntu SMP Thu Jan 5 11:43:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux ### log cdコマンドを打つと >rbash: cd: restricted コマンドが存在するか調べる >ls /usr/bin | grep cd >apt-cdrom コマンドの場所を調べる > where cd > rbash: /usr/lib/command-not-found: restricted: cannot specify `/' in command names rbshとは >rbash とは、制限付きのシェル(RESTRICTED SHELL) です。 システム運用アカウントのために役に立つシェルです。 rbash は、bash に付属しています。 rbash は、bash へのシンボリックリンクです。 制限アカウントのため以下のディレクトリ制限情報が書かれている >制限する環境の作り方 ログインシェルを rbash にします。 制限付きアカウントに許したいコマンドだけを集約したディレクトリを用意します。 /usr/local/rbash/bin 環境変数 PATH を /usr/local/rbash/bin だけにしておきます。 ファイル確認 >ls /usr/local/rbash/ >ls: cannot access '/usr/local/rbash/': No such file or directory コマンド実行ファイルの格納場所の確認 >which cd 応答なし パス確認 >echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin 環境変数確認 >export -p ``` declare -rx SHELL="/usr/bin/rbash" 怪しい declare -x SHLVL="1" declare -x SUDO_COMMAND="/usr/bin/su" declare -x SUDO_GID="1002" ``` 確認 >vi /usr/vin/bin/rbash 意味なかった ログインシェルを変更しようとしたけど、問題の意図に沿わないので却下 ``` chsh Changing the login shell for root Enter the new value, or press ENTER for the default Login Shell [/usr/bin/rbash]: ``` >bash起動時における設定ファイルの実行順序 bashがログインシェルとして起動された場合、 最初に/etc/profileを読み込んで実行します。 続いて、.bash_profile .bash_login .profileの順に ファイルを探し、 最初に見つかったファイルを読み込んで実行します。 らしいので、確認 >cat /etc/profile わからんかった >rbashの設定ファイルがわかれば解決できる cdコマンドを許可して 権限確認 >ls -l /usr/bin/rbash lrwxrwxrwx 1 root root 4 Jan 7 2022 /usr/bin/rbash -> bash ログイン時に rbashにログインしているため、 cd / にアクセスできないためにエラーが起こっている、初期ログイン時に bashに入ってあげればいいかも >cat /etc/passwd >root: x :0:0:root:/root:/usr/bin/rbash rootの初期bashの設定を発見 --- | Column 1 | Column 2 | Column 3 | | -------- | -------- | -------- | | Text | Text | Text |