サイトの不具合について
2024年5月22日からページにアクセスすると、他のページに誘導される事象が発生しました。
切り分けのため、2024年5月23日の19時頃にサイトのすべての情報を削除しましたが事象が改善せず、24日にレンタルサーバ会社に問い合わせ、原因が判明したのがその日の昼頃。
24日の午後から手作業でデータを少しずつ復元させ、現在はほぼ通常運用に戻っています。
備忘録で状況を残しておきます。
1.事象の詳細
最初に気づいたのは、トップページ(index.php)の内容が書き換えられる事象でした。
その後、.htaccessが自動生成され、いくつかのページがトップページに誘導される内容が記載されていました。
そこからさらに(トップページに埋め込まれた、暗号化されたスクリプトで)別のページにリダイレクトされていました。
それらのファイルを削除したり、再構築で上書きしても、すぐに元の内容に書き換えられてしまいます。
topコマンドやpsコマンドでプロセスを確認しても怪しいプロセスはありません。
www配下のすべてのページをバックアップ後、削除しましたが、index.phpや.htaccessが自動生成される事象が解消ぜず、rootユーザーで実行されていると推測し、レンタルサーバ会社のサポートにチャットで問い合わせ。
借りているレンタルサーバのプランには、rootに昇格する権限はありませんでした。
上記の状況を伝えたところ、rootで不審なプロセスが動作していたようで、プロセスを削除して頂き、ようやく事象が解消しました。
その後、MTを新規インストールしてブログの再構築を実施し、画像等のアセットはバックアップデータから丸ごと復元せず、ひとつずつ確認しながら戻しています。
2.原因と対処
おそらく、契約しているアカウントのログインパスワードを破られた後、rootのパスワードも破られて該当のプロセスが仕掛けられたものと思われます。
サポートから「現在動作プロセスが残っております」と言われたのですが、こちらで確認できる範囲のプロセスに該当するものがないことを伝えたところ、サポート側でプロセスを削除して頂けました。
3.今後の対応
サーバログインパスワードはかなり強固なものを設定していましたが、今後は定期的に変更したいと思います。
Movable Typeのダッシュボードプラグインの作り方
Movable Typeのダッシュボードプラグインの作り方を紹介します。
1.はじめに
ダッシュボードプラグインを作る機会があったので、サンプルを使って作り方をまとめてみました。
ここでは下記のサンプルを紹介します。
ユーザーダッシュボードに「サンプルダッシュボードウィジェット」を表示します。
選択すると、下記のようにログインしたユーザー名を表示します。
×印をクリックすると、ウィジェットが削除されます。
このサンプルプラグインの構造は次の通りです。
DashboardSample
├ config.yaml
├ lib
│ └ DashboardSample
│ └ CMS.pm
└ tmpl
└ sample.tmpl
サンプルは下記のURLよりダウンロードできます。
以下、それぞれのファイルについて解説します。
2.config.yaml
下記にサンプルを示します。
name: DashboardSample
id: DashboardSample
widgets:
DashboardSample:
label: サンプルダッシュボードウィジェット
# plugin: $DashboardSample
template: sample.tmpl
order: 1000
singular: 1
set: main
handler: $DashboardSample::DashboardSample::CMS::test
view:
- user
主な項目の意味は次の通りです。
- template:ダッシュボード用テンプレートファイル名
- order:表示順序
- singular:単独表示("1"固定。プルダウンから選択・表示したあと、プルダウンの候補から外すためのもの)
- set:表示領域(main:中央/sidebar:右カラム)
- handler:ダッシュボード表示用ハンドラ名
- view:表示種別(user:ユーザーダッシュボード/system:システム管理画面/website:親サイト/blog:子サイト)
"plugin"という項目もありますが、記述無しでも動作するようなのでコメントアウトしています。
記述する場合は、サンプルのように「id:」の値を"$"つきで記述してください。
3.sample.tmpl
下記にサンプルを示します。
<mtapp:widget
id="DashboardSample"
class="widget DashboardSample"
label="サンプルダッシュボードウィジェット"
can_close="1">
<p><mt:var name="name"></p>
</mtapp:widget>
ここではパラメータ「name」の値だけを表示するようにしています。
<p><mt:var name="name"></p>
ダッシュボードを表示したあとに×印で削除できるようにするには、mtapp:widgetタグに「can_close="1"」を付与します。
4.CMS.pm
下記にサンプルを示します。
package DashboardSample::CMS;
use strict;
use warnings;
sub test {
my $app = shift;
my ( $tmpl, $param ) = @_;
my $user = $app->user;
}
1;
sample.tmplの"name"に値を渡すために、下記の1行を追加しています。
$param->{name} = $user->nickname;
Movable Type検索結果画面のMTIncludeタグでファイルを読み込む方法
Movable Type検索結果画面のMTIncludeタグでファイルを読み込む方法を紹介します。
1.はじめに
MTで再構築するファイルの拡張子を".php"にして、そのページの中で頻繁に更新される部分を、
<?php include('foo.html'); ?>
で読み込むことで、ページ全体の再構築不要で情報を更新することができます。
ただ、検索結果ページはPerlのCGIで動作するため、PHPの方法を利用することができません。
ということで、検索結果画面のMTIncludeタグでファイルを読み込む方法を紹介します。
2.検索結果画面のMTIncludeタグでファイルを読み込む
1項のfoo.phpのパスを、仮に「/var/www/html/foo.html」とします。
このファイルを検索結果画面のMTIncludeタグで読み込むには、下記の手順が必要です。
まず、mt-config.cgiに
AllowFileInclude 1
を設定します(注:4項参照)。
次に、ファイル読み込み部分を次のようにします。
<$mt:Include file="/var/www/html/foo.html"$>
これで、検索結果画面でも情報を更新する部品を利用することができます。
3.サイトパスにテンプレートタグを使用する
2項ではファイルパスに「/var/www/html」を直接記述しましたが、テンプレートタグでサイトパスを取得するには次のように記述します。
<mt:Setvarblock name="foo"><$mt:SitePath$>/foo.html</mt:setvarblock>
<$mt:Include file="$foo"$>
1行目のMTSetVarBlockタグで、サイトパスとファイル名を文字列結合したものを、変数fooに設定します。
2行目のMTIncludeタグで、fileモディファイアに「$foo」と書くことで、変数fooの内容が展開され、
<$mt:Include file="/var/www/html/foo.html"$>
と同じ結果となります。
4.注意事項
AllowFileIncludeはセキュリティ対策として、デフォルトで無効(=0)となっています。
理由は「テンプレート編集の権限だけをもつユーザーが、ファイルシステム上の任意のファイルを読み出せるのは問題であるため」のようです。
このカスタマイズを利用する場合は、上記のセキュリティに十分配慮してください。