こんにちは。
今回は、自分が新卒の頃に本番環境でやらかしちゃった事件をお話ししようと思います。
本当は毎年年末に盛り上がる某所の「やらかしちゃった人」アドベントカレンダーに便乗して投稿しようと思っていたのですが、時期を逃し今頃になってしまいました。
今の私
サーバーサイドのチームで Ruby on Rails と MySQL をメインに設計したり実装したりしています。
時々Vueを触ります。
当時の私
20年ほど前のこと。四国某所の印刷会社にて「これからはアナログだけではいかん」と立ち上げられたばかりのデジタルチームに、新卒未経験でエンジニアとして採用されました。
上司を含めてプログラムに詳しい人が殆どいなかったため、OJTもない状態で、最初から企画・ディレクション・デザイン・コーディング・サーバーサイド・DB構築・インフラ構築と、一つの案件における全てのフローを一人で担当するという体制でした。
おかげでかなりタフに育ちましたし、未経験を採用していきなり案件を任せてくれた会社には今でも感謝しています。
やらかした内容
全クライアントの本番とステージングが乗っているサーバーで、root権限で rm -rf / を実行しました。
サイトの数はステージングと合わせて30ほどあったんじゃないかと思います。
細かい状況
知識がなくて進捗が遅いのを残業でカバーする日々。
田舎でみんなマイカー通勤のため終電という概念もなく、この頃の私は毎日一人で3時4時まで残業するのが当たり前でした。
その日も遅くまで残っており、「PHPでディレクトリを削除」する方法を調べていたところ、某所にて「rootでrm -rf / で消えるよ」という情報を発見。
・・・今思えば悪意のある投稿だったのですが、当時の私は焦っていたこともあり、「ほうほうなるほど」と調査もせず、root権限で動くPHPスクリプトで、exec関数から直接コマンドを叩くという実装をしてしまいました。
ステージングに反映し、実行。
うーん目的のディレクトリ消えないなぁ。
などと何度か試している間にサイトが真っ白になり動かなくなりました。
あれ?と思いサーバーにログインするも、cd やその他コマンドなども次々と効かなくなっていきます。
うーん、まぁもういい時間だし続きは明日にしよ!帰ろっと!
と、そのまま放置して帰宅。眠りにつきました・・・。
翌朝
出勤すると、会社が大騒ぎになっていました。
昨日何かやった?と聞かれ、顛末を伝える私。
頭を抱える上司。
ここでやっと状況を理解し、「とにかくデータを戻さねば」と、当時ホスティングをお願いしていた会社のサポートに電話しました。
ところが、バックアップを取るプランに入っていなかったため「データは戻せません」という回答でした。
しかし私のあまりの落ち込みように同情してくれたのか、「本来はやってないのですが今回だけ特別に」ということで、無償でデータを復旧してくれました。
もし対応してくれなければどうなっていたのか・・・今でも物凄く感謝しています!
最終的にデータは昨日の夜中時点に戻り、特に更新されたデータもなかったため、始末書を書いて騒動は終了しました。
その後の会社の対応
知識のない人間にroot権限を与えるのは良くない、ということで権限管理をきちんとすることになりました。
なにが良くなかったのか
いわずもがなですが・・・
- ステージングと本番が同居しており、さらに全クライアントのデータが一つのサーバーに乗っていた
- 一つのサイトに負荷がかかり、他のサイトに影響が出ることも時々発生していたにもかかわらず、この環境を良しとしていた
- ネットの情報を鵜呑みにして二次調査をしなかった
- AIを利用した開発が盛んになっている今、AIのソースを全て信用するのも怖いと思います
- 作業者がroot権限の怖さを認識していなかった
- PHPがroot権限で動いていた
- exec関数を安易に利用していた
- 常態化した深夜残業で注意力が散漫になっていた
- サーバーのバックアップが無かった
現在ではrm -rf /はそのままでは実行できず–no-preserve-root オプションが必要になっています。
ただ、当時の私であれば、恐らくネットにオプション付きで書かれていればそのまま実行していたと思います。
結局「情報を鵜呑みにしない。一度調べる」を徹底することが絶対だと思います。
最後に
普段はぼこぼこに怒られていた私ですが、この件についてはあまり責められませんでした。
ですが、これ以降めちゃくちゃ慎重な性格になりましたし(心配性すぎると言われるくらい)、今では早めに大きな事故を経験しておいてよかったと思っています。
以上、私が新卒の時にやらかしちゃった話でした!
