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 |