EC2インスタンス作成時のユーザーデータに「rm -rf /*」を渡してみた

[定期]よい子(大人を含む)はマネしないでね。
2022.03.18

息抜きが必要だ

こんにちは、のんピ(@non____97)です。

最近引越しをしたのでなんだか疲れてます。

ということで、rm -rf /*でも実行してみます。

単純にrm -rf /*を実行するのは今まで結構やってきました。

そのため、単純に実行してもつまらないので、EC2インスタンス作成時のユーザーデータにrm -rf /*を渡して、どのような挙動をするのか確認します。

EC2インスタンス君も

俺をおもちゃにして遊ぶな

と思っているに違いありません。楽しいからしょうがないですね。

早速やってみた

それでは早速やってみます。

ユーザーデータでrm -rf /*渡して正常に実行されたとしても、ログが見えないととても悲しい気持ちになります。

そこで、以下AWSのドキュメントを参考にインスタンスのコンソールログにユーザーデータを出力するようにしてあげます。

実際に渡すユーザーデータは以下になります。

./src/ec2/user_data_amazon_linux2.sh

# -x to display the command to be executed
set -x

# Redirect /var/log/user-data.log and /dev/console
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1

rm -rf /*

EC2インスタンスはAWS CDKで定義します。

EC2インスタンス作成時に準備したユーザーデータを渡すようにしてあげます。実際のコードは以下の通りです。

./lib/ec2-stack.ts

import { Stack, StackProps, aws_iam as iam, aws_ec2 as ec2 } from "aws-cdk-lib";
import { Construct } from "constructs";
import * as fs from "fs";

export class Ec2Stack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const vpc = new ec2.Vpc(this, "Vpc", {
      enableDnsHostnames: true,
      enableDnsSupport: true,
      maxAzs: 1,
      subnetConfiguration: [
        { name: "Public", subnetType: ec2.SubnetType.PUBLIC, cidrMask: 24 },
      ],
    });

    // EC2 Instance IAM role
    const ec2InstanceIamRole = new iam.Role(this, "Ec2InstanceIamRole", {
      assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
      managedPolicies: [
        iam.ManagedPolicy.fromAwsManagedPolicyName(
          "AmazonSSMManagedInstanceCore"
        ),
      ],
    });

    // User data for Amazon Linux 2
    const userDataParameter = fs.readFileSync(
      "./src/ec2/user_data_amazon_linux2.sh",
      "utf8"
    );
    const userDataAmazonLinux2 = ec2.UserData.forLinux({
      shebang: "#!/bin/bash",
    });
    userDataAmazonLinux2.addCommands(userDataParameter);

    // EC2 Instance
    new ec2.Instance(this, "Ec2Instance", {
      instanceType: new ec2.InstanceType("t3.micro"),
      machineImage: ec2.MachineImage.latestAmazonLinux({
        generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      }),
      vpc: vpc,
      blockDevices: [
        {
          deviceName: "/dev/xvda",
          volume: ec2.BlockDeviceVolume.ebs(8, {
            encrypted: true,
            volumeType: ec2.EbsDeviceVolumeType.GP3,
          }),
        },
      ],
      role: ec2InstanceIamRole,
      userData: userDataAmazonLinux2,
    });
  }
}

準備ができたら、npx cdk deployでEC2インスタンスをデプロイします。

EC2インスタンス作成後、コンソールログを確認します。

システムログを取得

正しくログ取得がされていることが確認できました。

加えて、/var/log/journal/ec241e799eaf2c0ee222f87da91ab53c/system.journal: Journal file has been deleted, rotating.となっていることからrm -rf /*も正しく動作していそうですね。やったね。

get-console-outputでAWS CLIからもログを確認してみます。

$ aws ec2 get-console-output \
    --instance-id i-0f64af93937b42f9d \
    --output text
i-0f64af93937b42f9d     1:55:39 user-data: rm: cannot remove '/sys/module/intel_idle/uevent': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/intel_idle/parameters/max_cstate': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/keyboard/uevent': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/keyboard/parameters/brl_timeout': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/keyboard/parameters/brl_nbchords': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/zswap/uevent': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/zswap/parameters/enabled': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/zswap/parameters/max_pool_percent': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/zswap/parameters/compressor': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/zswap/parameters/zpool': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/tpm_crb/uevent': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/tpm_crb/version': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/initsize': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/uevent': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/notes/.note.gnu.build-id': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/taint': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/srcversion': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/holders/dm_region_hash': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/holders/dm_mirror': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/refcnt': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/coresize': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/initstate': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/__kcrctab': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/__ksymtab': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.orc_unwind': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.strtab': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/__mcount_loc': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.exit.text': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.bss': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.orc_unwind_ip': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.gnu.linkonce.this_module': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.symtab': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.init.text': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.note.gnu.build-id': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.text': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.data': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.rodata.str1.1': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.parainstructions': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/__ksymtab_strings': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/dm_log/sections/.rodata.str1.8': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/hid/uevent': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/hid/parameters/ignore_special_drivers': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/hid/parameters/debug': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/netpoll/uevent': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/netpoll/parameters/carrier_timeout': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/evdev/initsize': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/evdev/uevent': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/evdev/notes/.note.gnu.build-id': Operation not permitted
<13>Mar 18 01:55:39 user-data: rm: cannot remove '/sys/module/evdev/taint': Operation not permitted

見覚えのあるログですね。地元に帰省した感覚と似ています。

ちなみに、表示されるログは最新の64 KB のみのようです。

表示される出力のうち、保存されるのは最新の64 KB のみです。この出力は、出力の送信から少なくとも1時間使用可能です。

接続できないインスタンスのトラブルシューティング - Amazon Elastic Compute Cloud

念の為の確認を込めて、SSMセッションマネージャーで接続しようとしたところ、「接続できる訳ないだろ!」と言わんばかりに怒られました。当然です。

SSMセッションマネージャーでインスタンスに接続

久しぶりに実行したら良い気分転換になりました

EC2インスタンス作成時のユーザーデータにrm -rf /*を渡してみました。

ユーザーデータで渡しても正しくrm -rf /*が実行されることを確認できて、なんだか元気が出ました。

こちらのコードは以下リポジトリに保存してます。自分の目で確かめたい人は自己責任で試してください。

この記事は誰の役にも立たないかもしれませんが、誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!