NO IMAGE

systemctl disableしてもcloud-initでサービスが起動して困ったお話

  • 2023年5月11日
  • AWS, IT
AWS NO IMAGE

こんにちはますのです。
EC2を構築していてcloud-initが勝手にサービス起動して困ること、ありますよね。

今回はsystemctl disableをしていてもサービスが勝手に起動してしまう時に対応したことをメモしていきます。

本手順はsshdで試しているため、最悪の場合サーバへの接続が不可となります。
お試しの際は影響のないサービスや環境で実施、ならびに発生した影響に関しては自己責任でお願いいたします。

結論:systemctl maskを利用する

今回実施したことは下記コマンドによるサービス起動の停止となります。

$ sudo systemctl mask sshd

前提

以下の環境を前提として今回の対応に踏み切りました。

  • OSはAmazonLinux2で検証
  • sshdをEC2再起動時に自動起動しないようにしたい
  • cloud-initはアンインストールしない
  • Sesion Managerでのssh接続は不可
  • セキュリティグループのsshポート(22)はアタッチしたままとする
  • 以下のコマンドは実施済である
    • systemctl stop sshd
    • systemctl disable sshd

発生していた事象

今回「systemctl mask」に至るまでの経緯について記載します。

  • EC2を再起動、停止→起動どちらを実施してもsshd.serviceが立ち上がってしまう
  • cloud-initのconf:cloud-configの設定を触っても解決出来ず
  • cloud-initをアンインストールした場合はdisable状態のsshd起動はされなかいことを確認
cloud-initをアンインストールした時点でsshdが起動しなくなることを確認しました。
つまりcloud-initが原因であることは確定と考えます。
しかしcloud-initのconfigファイルの理解が足りないこともあり、config編集では解決には至りませんでした。

設定方法

結論でも書いた通り、下記コマンドを実行した完了です。

$ sudo systemctl mask sshd

なお、maskを解除する場合は下記コマンドとなります。

$ sudo systemctl unmask sshd

systemctl maskとは

manコマンドで確認した説明によると、自動起動もしないけど手動起動(systemctl start)でも起動しなくなるから注意と記載されています。

$ man systemctl 
~~~~(略)~~~~
       mask NAME...
           Mask one or more unit files, as specified on the command line. This will link these units to /dev/null, making it impossible to start them. This is a stronger
           version of disable, since it prohibits all kinds of activation of the unit, including enablement and manual activation. Use this option with care. This honors the
           --runtime option to only mask temporarily until the next reboot of the system. The --now option can be used to ensure that the units are also stopped.

       unmask NAME...
           Unmask one or more unit files, as specified on the command line. This will undo the effect of mask.

/etc/systemd/system/(name).service ファイルを、/dev/null へのシンボリックリンクに置き換え、実際のユニットファイルが systemd ファイルにアクセスできないようにします。

引用:(RHEL8 )14.7. システムサービスの無効化

ChatGPT先生にも簡単に翻訳してもらいおおよその確認。

maskはdisaleの強力なバージョンであり、有効化や手動による有効化を含むユニットのあらゆる種類の有効化が禁止されます。このオプションは注意して使用してください。これにより、 –runtimeオプションは、次のシステム再起動まで一時的にマスクするために使用されます。–nowオプションは、ユニットが停止されることも保証します。

オプション「–runtime」を試してみる

runtimeを試したところ、こちらはmaskされていてもシステム再起動時には起動する状態となるようです。

[root@ip-172-31-8-4 ~]# systemctl mask sshd --runtime
Created symlink from /run/systemd/system/sshd.service to /dev/null.

[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead) since Wed 2023-05-10 17:27:53 UTC; 10s ago
Main PID: 3092 (code=exited, status=0/SUCCESS)

[root@ip-172-31-8-4 ~]# shutdown -r now

~~~[再起動後]~~~

[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2023-05-10 17:29:23 UTC; 1min 19s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 3096 (sshd)
CGroup: /system.slice/sshd.service
└─3096 /usr/sbin/sshd -D

May 10 17:29:23 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Starting OpenSSH server daemon...
May 10 17:29:23 ip-172-31-8-4.ap-northeast-1.compute.internal sshd[3096]: Server listening on 0.0.0.0 port 22.
May 10 17:29:23 ip-172-31-8-4.ap-northeast-1.compute.internal sshd[3096]: Server listening on :: port 22.
May 10 17:29:23 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Started OpenSSH server daemon.

オプション「–now」を試してみる

「–now」オプションで試してみます。
ついでにオプション有無での違いをchatGPTさんへ確認。

–now オプションを使用すると、ユニットが現在実行中である場合にユニットが即座に停止され、–nowオプションを使用しない場合、ユニットが停止するのはシステム再起動後です。

検証結果から正しいことが分かりました。
サービスが起動している状態で実行しても、–nowオプションをつけていればマスク設定と共にサービス停止状態に変化します。
また、OS再起動後にsshdが起動しないことを確認できました。

[root@ip-172-31-8-4 ~]# systemctl mask sshd --now
Created symlink from /etc/systemd/system/sshd.service to /dev/null.

[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead) since Wed 2023-05-10 17:34:34 UTC; 7s ago
Main PID: 3096 (code=exited, status=0/SUCCESS)

[root@ip-172-31-8-4 ~]# shutdown -r now

~~~[再起動後]~~~

[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)

May 10 17:36:35 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Cannot add dependency job for unit sshd.service, ignoring: Unit is masked.
Warning: sshd.service changed on disk. Run 'systemctl daemon-reload' to reload units.
–nowオプションを付けた場合、マスク設定と共に即時ユニット停止に至ります。
systemctl stop sshdを忘れていたとしても、–nowがついていれば停止状態まで持っていけるということですね。

オプション無しで試してみる

「systemctl stop」を事前にしていた場合は–nowオプションを付けた場合と同じ動きになります。
下記の通りActive状態でmaskを設定した場合、OS再起動時にユニット停止となります。

[root@ip-172-31-8-4 ~]# systemctl mask sshd
Created symlink from /etc/systemd/system/sshd.service to /dev/null.

## maskは設定されたが起動状態である
[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service
   Loaded: masked (/dev/null; bad)
   Active: active (running) since Wed 2023-05-10 17:51:04 UTC; 24s ago
 Main PID: 3358 (sshd)
   CGroup: /system.slice/sshd.service
           └─3358 /usr/sbin/sshd -D

May 10 17:51:03 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Starting OpenSSH server daemon...
May 10 17:51:04 ip-172-31-8-4.ap-northeast-1.compute.internal sshd[3358]: Server listening on 0.0.0.0 port 22.
May 10 17:51:04 ip-172-31-8-4.ap-northeast-1.compute.internal sshd[3358]: Server listening on :: port 22.
May 10 17:51:04 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Started OpenSSH server daemon.
May 10 17:51:18 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Current command vanished from the unit file, execution of the command list won't be resumed.

## list-unitでもmaskedとなっていることを確認
[root@ip-172-31-8-4 ~]# systemctl list-units --all | sshd
sshd re-exec requires execution with an absolute path
[root@ip-172-31-8-4 ~]# systemctl list-units --all | grep ssh
  sshd-keygen.service                                                             loaded    inactive dead      OpenSSH Server Key Generation
● sshd.service                                                                    masked    active   running   sshd.service
  sshd.socket           

[root@ip-172-31-8-4 ~]# shutdown -r now

~~~[再起動後]~~~

[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)

May 10 17:57:01 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Cannot add dependency job for unit sshd.service, ignoring: Unit is masked.
Warning: sshd.service changed on disk. Run 'systemctl daemon-reload' to reload units.

おまけ:EC2インスタンスの復元方法

筆者はsshdを起動させる方法として下記を想定しています。

  • 対象のEC2インスタンスのAMIを取得
  • AMIから新たにEC2インスタンスを作成
  • EC2インスタンス作成時の設定で、ユーザデータに「systemctl unmask」を行うシェルを設定

ユーザーデータ設定方法

実際のAMI復元時のユーザーデータとなります。

#!/bin/bash
systemctl unmask sshd
systemctl enable sshd
systemctl start sshd

設定箇所:
EC2インスタンス作成画面  > 高度な詳細 > ユーザーデータに貼り付け > インスタンスを起動 より起動。

SessionManagerが利用出来ない場合はAMIからの復元でユーザーデータから起動するように設定します。
他手段としては、EBSボリュームを別インスタンスにアタッチするなども考えられます。
※ただし構築時の設計次第なのでAMIが手っ取り早い気持ちです。
AMIからEC2インスタンスのmask設定を解除して起動する場合は参考にしてみてください。

参考サイト

NO IMAGE
最新情報をチェックしよう!