WordPress サーバーへの攻撃?

先週から派遣先で使っているブログサーバーのアクセスログを解析しています。

ブログで使っている WordPress で使っている自作のテーマに不備があり、大量のログが出ているのを知っていたので、それらの不具合を改修したので出なくなったのを確認してます。
ついでに、他に不備があればいっしょに修正してしまおうと探したところ、攻撃の痕跡がいくつも見つかりました。

ネットでサーバーに対する攻撃の記事とかを読むし、ニュースにもなって気になっていたのですが、思ったより頻繁に行われているようです。
派遣先は、山形県にある大学で、まあ日本で有名とは言えませんが、地元では誰でも知っているようなところで、ネットでの発信もいろいろとやっています。検索サイトで探せば幾つも出てくるところなのですが、海外にも知られている訳では無いと思います。

きっと過去にも似たような攻撃を受けて、何かかしらのリストに載ってしまったのでしょうか。ここ2日くらいのログをざっと見ただけでも、海外からの攻撃が幾つもありました。

いずれもWordPress を標準的にインストールした場合に存在するパスへのアクセスで、今使っているサーバーにそのファイルは存在しません。そのため、「ファイルが無い」(httpd のステータスコードの 404 )が表示されていると思うのですが、いろいろと試してアクセスしているのでしょう。

中にはアップロードした怪しいスクリプトを実行しようとするアクセスもありましたが、元からそんなファイルは存在しないので、こっちも「ファイルが無い」という表示がされているはず。

とはいえ、これだけアクセスがきているということは、油断していると不正アクセスを許してしまうか

もしれない、ということであまりいいことではない。ちょっと便利だからといって、変なバックドアを作らないように注意しないといけない。

なお、派遣先のサーバーには、こんなアクセスがありました。

POST /wordpress/wp-content/uploads/2015/10/script.php 
GET /wp-login.php 
GET //wp-admin/options-link.php?x1  
GET /?????/wp-content/uploads/2013/02//wp-admin/includes/themes.php?x1  
GET /?????/wp-content/uploads/2013/02//wp-admin/options-link.php?x1  
GET //wp-admin/admin-ajax.php?action=revslider_show_image&img=../wp-config.php  
GET /wp-content/plugins/wp-ecommerce-shop-styling/includes/download.php?filename=../../../../wp-config.php
GET /wp-login.php?action=register

WordPress のブログ記事を普通に見るだけなら拡張子が.phpのファイルをアクセスすることはありません。攻撃と思っていいと思います。今回確認したサーバーへは、特に wp-config.php を表示させようというアクセスがきてました。やはり、WordPress はこのファイルがセキュリティ上のネックなのかもしれません。

ruby を使う

最近、また ruby を使っています。自宅ではなく、派遣先でのことです。

やることはテキストファイルの加工なんで、別に、awk でも、perl でも、なんなら php でもいいでんですが、書きやすいという点ではやっぱり ruby が一番という気がしてます。

今やっているのは、httpd のログファイルの解析。
世の中には、httpd のログを解析する仕組みはいくらでもあるのですが、できるだけ元のデータ
が見たいなと思う。しかも、必要な箇所だけ表示したり、集計したりすると Excel に読めれば
ベスト、と思っているので、Excel に読めるようにCSVファイルになっていると都合がいい。

最初から httpd のログをそんな風に出力できれば問題ないのだろうが、なかなか勝手にいじる
訳にもいかない、となると、デフォルトの形式で出力されたログファイルを、Excel で読みやすいように加工しようか、ということに。

昔は、ruby でなんて考えられないくらい CPU が遅かったので、こういうのはちゃんとCで書いたものだ。しかし、最近は CPU が早いので ruby でもやれてしまう。いい時代になったな…

今回作成したのは、こんな感じのスクリプトです。

#!/usr/bin/ruby
#
def explode_word( string )
  start_p = @current_pos
  if start_p >= string.length then
    return false
  end
  key = string[start_p, 1]
  if key.eql?("[") then
    e_pos = string.index("]", start_p) +1
  elsif key.eql?("\"") then
    e_pos = string.index("\"", start_p+1) +1
  else
    e_pos = string.index(" ", start_p)
  end
  ret_s = string[start_p, (e_pos - start_p)]
  @current_pos = e_pos+1;
  return( ret_s )
end
#

filename = "access_log"
words = Array.new
logs_ip = Array.new
logs_date = Array.new
logs_hour = Array.new
logs_url = Array.new
logs_stat = Array.new
logs_agent = Array.new

if( fp = open( filename, "r") ) then
    fp.each_line do |line|
	tmp = line.chop
	@current_pos = 0
	i=0
	while( (words[i] = explode_word(tmp) ) != false ) do
	  i=i+1
	end
	date_s = words[3][1,11]
	hour_s = words[3][13,2]
	logs_date[log_count] = date_s
	logs_hour[log_count] = hour_s
# access url
	logs_url[log_count] = words[4]
# status ( ex. 200 401 404 )
	logs_stat[log_count] = words[5]
# access agent
	logs_agent[log_count] = words[8]
# 
	log_count = log_count +1

    end
    fp.close
end
#
# for status = 404
#
wfp = open("404.log", "w")
i=0
while( i < log_count ) do
  if logs_stat[i].to_i == 404 then
    wfp.write( logs_ip[i]+ "," )
    wfp.write( logs_date[i]+ "," )
    wfp.write( logs_hour[i]+ "," )
    wfp.write( logs_url[i]+ "," )
    wfp.write( logs_stat[i]+ "," )
    wfp.write( logs_agent[i]+ "\n" )
  end
  i=i+1
end

1行に出力されている各項目を切り出して、一旦配列に入れ、そこから Excel で使いたいデータにしてCSVで出力しています。当初はステータス毎にファイルに書き出そうかと思ったのですが、結局データが多すぎるので、404(ファイルが存在しない)に注目して今回は確認を行いました。それでも、結構出ています。

ブログの記事は、それぞれ担当者が書いており、テクのある人は自分でテーマを作ったりしている(作ってもらっている?)ようです。前任者はサーバーを設定すれば終わり、という管理者だったようで、抜けが結構ありました。まあ、自作したテーマのミス?というのもあり、この辺はログを見れる人でないと解らないかも、というのも。

サーバーが安定して稼動してくれればいいのですが、エラーがたくさん出ている状況は管理者としては気分がよくないし。整理できてよかったかも。

同じように error_log でも同じように作ってみました。

#!/usr/bin/ruby
#

def explode_word( string )
  start_p = @current_pos
  if start_p >= string.length then
    return false
  end
  key = string[start_p, 1]
  if key.eql?("[") then
    e_pos = string.index("]", start_p) +1
  else
    e_pos = string.length()
  end
  ret_s = string[start_p, (e_pos - start_p)]
  @current_pos = e_pos+1;
  return( ret_s )
end

filename = "blog.tuad.ac.jp-error_log.1"
#filename = "err1000.log"
words = Array.new
logs_date = Array.new
logs_stat = Array.new
logs_cli = Array.new
logs_msg = Array.new

@current_pos = 0
log_count = 0

if( fp = open( filename, "r" ) ) then
  fp.each_line do |line|
    tmp = line.chop
    @current_pos = 0
    i=0
    while( (words[i] = explode_word(tmp)) != false ) do
	i=i+1
    end

    logs_date[log_count] = words[0]
    logs_stat[log_count] = words[1]
    if words[3] == false then
      logs_cli[log_count] = "[-]"
      logs_msg[log_count] = words[2]
    else
      logs_cli[log_count] = words[2]
      logs_msg[log_count] = words[3]
    end
    log_count = log_count +1
  end
  fp.close
end

if log_count > 0 then
  wfh = open("err.log", "w")
  i=0
  while( i < log_count ) do
    wfh.write( logs_date[i].to_s + "," )
    wfh.write( logs_stat[i].to_s + "," )
    wfh.write( logs_cli[i].to_s + "," )
    wfh.write( logs_msg[i].to_s + "\n" )
    i=i+1
  end
end

こういうので調べると実は知らなかったことがあり、今時のサーバー管理が学べます。
来週、今回手を入れた箇所がちゃんと動いているのを確認する予定。
そこで、また、何か発見があるかも、とちょっとワクワクしてます。

muninの設定、その後

リソース監視システムの munin は、今日、無事設定を完了して今も動作しています。

今まで、df コマンドや top コマンドで散々見てきたサーバーなので、munin にしたからといって何か変化があるわけではありません。予想通りのグラフができています。

ただ、何かあった場合、こういう日常どうなっているかが基準となって、判断するわけで、グラフになっているとかなり心強い味方になってくれます。
まあ、このグラフを利用せずに済むのが一番いいこなんでしょうがね。

PS.
実は、問題がありました。
前日、インストールができたんで、プラグインを全て一旦削除して安心して帰宅したのですが、これがまずかった。インストールできた時点かあ cron が動いていて、プラグインが無い、というエラーが5分毎に出てました。

「このエラー何?」という質問があり、よく見たら

Subject: Cron  test -x /usr/bin/munin-cron &&
/usr/bin/munin-cron

[FATAL] There is nothing to do here, since there are no nodes with any
plugins.  Please refer to http://munin-monitoring.org/wiki/FAQ_no_graphs at
/usr/share/munin/munin-html line 40

ってこれは、プラグインが無いことで、HTMLが作れない、というエラーですね。

いや、油断しないことですね。

サーバーのシソース管理「munin」を設定

ネットで調べたところサーバのリソース管理は、今は、「Munin」という便利なのがある、ということで、早速仮想環境で

確認したところ、なかなかいい感じです。

以前、20台以上の Linux 機を、net-snmp と MRTG で苦労して構築した環境が、ものの数分でできてしまう。いや、い

い時代になりました。デフォルトの設定では、「こんなの見るかな?」と思えるグラフもあるのですが、削除や追加は簡

単にできるし、いろいろとやれそうです。

仮想環境でいい感じなので本番に入れようとしたら、はまりました。

本番のサーバーは、CentOS 5.7 (古い!)。
CentOSなので、yum で epel から簡単に入ると思っていたのですが、ダメみたいです。
メッセージは、こんなの。

# yum --enablerepo epel install munin
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * epel: ftp.jaist.ac.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.nara.wide.ad.jp
epel                                                     | 3.6 kB     00:00     
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package munin.noarch 0:2.0.25-11.el5 set to be updated
--> Processing Dependency: sysstat for package: munin
--> Processing Dependency: perl(Taint::Runtime) for package: munin
--> Processing Dependency: perl(RRDs) for package: munin
--> Processing Dependency: perl(Params::Validate) for package: munin
--> Processing Dependency: perl(Net::Server::Fork) for package: munin
--> Processing Dependency: perl(Net::Server) for package: munin
--> Processing Dependency: perl(Net::SSLeay) for package: munin
--> Processing Dependency: perl(Net::SNMP) for package: munin
--> Processing Dependency: perl(Net::CIDR) for package: munin
--> Processing Dependency: perl(Munin::Node::ProxySpooler) for package: munin
--> Processing Dependency: perl(Munin::Node::Config) for package: munin
--> Processing Dependency: perl(Munin::Common::Timeout) for package: munin
--> Processing Dependency: perl(Munin::Common::TLSClient) for package: munin
--> Processing Dependency: perl(Munin::Common::Defaults) for package: munin
--> Processing Dependency: perl(Munin::Common::Config) for package: munin
--> Processing Dependency: perl(Log::Log4perl) for package: munin
--> Processing Dependency: perl(IO::Socket::INET6) for package: munin
--> Processing Dependency: perl(HTML::Template) for package: munin
--> Processing Dependency: perl(File::Copy::Recursive) for package: munin
--> Processing Dependency: perl(FCGI) for package: munin
--> Processing Dependency: perl(Digest::SHA1) for package: munin
--> Processing Dependency: perl(Digest::HMAC) for package: munin
--> Processing Dependency: perl(DateTime) for package: munin
--> Processing Dependency: perl(Date::Manip) for package: munin
--> Processing Dependency: perl(Crypt::DES) for package: munin
--> Processing Dependency: perl(Carp::Always) for package: munin
--> Processing Dependency: perl(Cache::Memcached) for package: munin
--> Processing Dependency: perl(Cache::Cache) for package: munin
--> Running transaction check
---> Package fcgi-perl.x86_64 0:2.4.0-13.el5 set to be updated
--> Processing Dependency: fcgi = 2.4.0-13.el5 for package: fcgi-perl
---> Package munin-common.noarch 0:2.0.25-11.el5 set to be updated
---> Package munin-node.noarch 0:2.0.25-11.el5 set to be updated
--> Processing Dependency: perl(XML::Parser) for package: munin-node
--> Processing Dependency: perl(XML::LibXML) for package: munin-node
--> Processing Dependency: perl(Net::DNS) for package: munin-node
--> Processing Dependency: perl(List::MoreUtils) for package: munin-node
--> Processing Dependency: perl(DBD::Pg) for package: munin-node
---> Package perl-Cache-Cache.noarch 0:1.05-1.el5 set to be updated
--> Processing Dependency: perl(IPC::ShareLite) for package: perl-Cache-Cache
--> Processing Dependency: perl(Error) for package: perl-Cache-Cache
---> Package perl-Cache-Memcached.noarch 0:1.26-3.el5 set to be updated
---> Package perl-Carp-Always.noarch 0:0.09-2.el5 set to be updated
---> Package perl-Crypt-DES.x86_64 0:2.05-3.el5 set to be updated
---> Package perl-DateManip.noarch 0:5.44-1.2.1 set to be updated
---> Package perl-DateTime.x86_64 1:0.41-1.el5 set to be updated
--> Processing Dependency: perl(Class::Singleton) >= 1.03 for package: perl-DateTime
--> Processing Dependency: perl(Class::Singleton) for package: perl-DateTime
---> Package perl-Digest-HMAC.noarch 0:1.01-15 set to be updated
---> Package perl-Digest-SHA1.x86_64 0:2.11-1.2.1 set to be updated
---> Package perl-File-Copy-Recursive.noarch 0:0.35-1.el5 set to be updated
---> Package perl-HTML-Template.noarch 0:2.9-1.el5.2 set to be updated
---> Package perl-IO-Socket-INET6.noarch 0:2.51-2.fc6 set to be updated
--> Processing Dependency: perl(Socket6) for package: perl-IO-Socket-INET6
---> Package perl-Log-Log4perl.noarch 0:1.13-2.el5 set to be updated
--> Processing Dependency: perl(Log::Dispatch::FileRotate) >= 1.10 for package: perl-Log-Log4perl
--> Processing Dependency: perl(XML::DOM) for package: perl-Log-Log4perl
--> Processing Dependency: perl(Log::Dispatch::Syslog) for package: perl-Log-Log4perl
--> Processing Dependency: perl(Log::Dispatch::Screen) for package: perl-Log-Log4perl
--> Processing Dependency: perl(Log::Dispatch::File) for package: perl-Log-Log4perl
--> Processing Dependency: perl(IPC::Shareable) for package: perl-Log-Log4perl
---> Package perl-Net-CIDR.noarch 0:0.13-2.el5 set to be updated
---> Package perl-Net-SNMP.noarch 0:5.2.0-1.el5.1 set to be updated
---> Package perl-Net-SSLeay.x86_64 0:1.30-4.fc6 set to be updated
---> Package perl-Net-Server.noarch 0:0.96-2.el5 set to be updated
--> Processing Dependency: perl(IO::Multiplex) for package: perl-Net-Server
---> Package perl-Params-Validate.x86_64 0:0.88-3.el5 set to be updated
---> Package perl-Taint-Runtime.x86_64 0:0.03-1.el5.1 set to be updated
---> Package rrdtool-perl.x86_64 0:1.2.27-4.el5 set to be updated
--> Processing Dependency: rrdtool = 1.2.27-4.el5 for package: rrdtool-perl
--> Processing Dependency: librrd.so.2()(64bit) for package: rrdtool-perl
---> Package sysstat.x86_64 0:7.0.2-13.el5 set to be updated
--> Running transaction check
---> Package fcgi.x86_64 0:2.4.0-13.el5 set to be updated
---> Package perl-Class-Singleton.noarch 0:1.03-3.el5 set to be updated
---> Package perl-DBD-Pg.x86_64 0:1.49-4.el5_8 set to be updated
---> Package perl-Error.noarch 1:0.17010-1.el5 set to be updated
---> Package perl-IO-Multiplex.noarch 0:1.08-5.el5 set to be updated
---> Package perl-IPC-ShareLite.x86_64 0:0.13-4.el5 set to be updated
---> Package perl-List-MoreUtils.x86_64 0:0.33-5.el5 set to be updated
---> Package perl-Log-Dispatch.noarch 0:2.20-1.el5 set to be updated
--> Processing Dependency: perl(Mail::Sendmail) for package: perl-Log-Dispatch
--> Processing Dependency: perl(Mail::Sender) for package: perl-Log-Dispatch
--> Processing Dependency: perl(Mail::Send) for package: perl-Log-Dispatch
--> Processing Dependency: perl(MIME::Lite) for package: perl-Log-Dispatch
---> Package perl-Log-Dispatch-FileRotate.noarch 0:1.16-1.el5 set to be updated
---> Package perl-Log-Log4perl.noarch 0:1.13-2.el5 set to be updated
--> Processing Dependency: perl(IPC::Shareable) for package: perl-Log-Log4perl
---> Package perl-Net-DNS.x86_64 0:0.59-3.el5 set to be updated
--> Processing Dependency: perl(Net::IP) for package: perl-Net-DNS
---> Package perl-Socket6.x86_64 0:0.19-3.fc6 set to be updated
---> Package perl-XML-DOM.noarch 0:1.44-2.el5 set to be updated
--> Processing Dependency: perl(XML::RegExp) for package: perl-XML-DOM
---> Package perl-XML-LibXML.x86_64 0:1.58-6 set to be updated
--> Processing Dependency: perl-XML-NamespaceSupport for package: perl-XML-LibXML
--> Processing Dependency: perl-XML-LibXML-Common for package: perl-XML-LibXML
--> Processing Dependency: perl(XML::SAX::Exception) for package: perl-XML-LibXML
--> Processing Dependency: perl(XML::LibXML::Common) for package: perl-XML-LibXML
--> Processing Dependency: perl-XML-SAX for package: perl-XML-LibXML
--> Processing Dependency: perl(XML::SAX::DocumentLocator) for package: perl-XML-LibXML
--> Processing Dependency: perl(XML::SAX::Base) for package: perl-XML-LibXML
--> Processing Dependency: perl(XML::NamespaceSupport) for package: perl-XML-LibXML
---> Package perl-XML-Parser.x86_64 0:2.34-6.1.2.2.1 set to be updated
---> Package rrdtool.x86_64 0:1.2.27-4.el5 set to be updated
--> Running transaction check
---> Package perl-Log-Log4perl.noarch 0:1.13-2.el5 set to be updated
--> Processing Dependency: perl(IPC::Shareable) for package: perl-Log-Log4perl
---> Package perl-MIME-Lite.noarch 0:3.01-5.el5 set to be updated
---> Package perl-Mail-Sender.noarch 0:0.8.13-2.el5.1 set to be updated
---> Package perl-Mail-Sendmail.noarch 0:0.79-9.el5.1 set to be updated
---> Package perl-MailTools.noarch 0:1.77-1.el5.centos set to be updated
--> Processing Dependency: perl(Date::Format) for package: perl-MailTools
--> Processing Dependency: perl(Date::Parse) for package: perl-MailTools
---> Package perl-Net-IP.noarch 0:1.25-2.fc6 set to be updated
---> Package perl-XML-LibXML-Common.x86_64 0:0.13-8.2.2 set to be updated
---> Package perl-XML-NamespaceSupport.noarch 0:1.09-1.2.1 set to be updated
---> Package perl-XML-RegExp.noarch 0:0.03-2.el5 set to be updated
---> Package perl-XML-SAX.noarch 0:0.14-13.el5 set to be updated
--> Running transaction check
---> Package perl-Log-Log4perl.noarch 0:1.13-2.el5 set to be updated
--> Processing Dependency: perl(IPC::Shareable) for package: perl-Log-Log4perl
---> Package perl-TimeDate.noarch 1:1.16-5.el5 set to be updated
--> Finished Dependency Resolution
perl-Log-Log4perl-1.13-2.el5.noarch from epel has depsolving problems
  --> Missing Dependency: perl(IPC::Shareable) is needed by package perl-Log-Log4perl-1.13-2.el5.noarch 

(epel)
Error: Missing Dependency: perl(IPC::Shareable) is needed by package perl-Log-Log4perl-1.13-2.el5.noarch 

(epel)
 You could try using --skip-broken to work around the problem
 You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest
The program package-cleanup is found in the yum-utils package.
#
#

エラーが出ている、
perl-Log-Log4perl-1.13-2.el5.noarch
ですが、どうやってもインストールできませんでした。

やってみのは、次のとおり。
(1) yum で perl-Log-Log4perl-1.13-2.el5.noarch をインストールしようとしたがダメ。
(2) yum の設定で、epel は、国内のミラーを参照しているのですが、このミラー4つを直接指定してみたのですが、それ

ぞれ全てでエラーでした。
(3) じゃ、ということで perl-Log-Log4perl-1.13-2.el5.noarch.rpm をダウンロードして、rpm コマンドで入れてみよう

としたのですが、これもダメ。

もしかして、perl の全パッケージをインストールする必要があるのかな。

# rpm -ivh perl-Log-Log4perl-1.13-2.el5.noarch.rpm
error: Failed dependencies:
	perl(IPC::Shareable) is needed by perl-Log-Log4perl-1.13-2.el5.noarch
	perl(Log::Dispatch::File) is needed by perl-Log-Log4perl-1.13-2.el5.noarch
	perl(Log::Dispatch::FileRotate) >= 1.10 is needed by perl-Log-Log4perl-1.13-2.el5.noarch
	perl(Log::Dispatch::Screen) is needed by perl-Log-Log4perl-1.13-2.el5.noarch
	perl(Log::Dispatch::Syslog) is needed by perl-Log-Log4perl-1.13-2.el5.noarch
	perl(RRDs) is needed by perl-Log-Log4perl-1.13-2.el5.noarch
	perl(XML::DOM) is needed by perl-Log-Log4perl-1.13-2.el5.noarch

yum は、パッケージの依存関係をチェックして必要なパッケージもいっしょにインストールするはず。
実際、仮想に入れたCentOS 6.7 では、すべてのパッケージが1つのコマンドでインストールされました。

ですが、CentOS 5.7 に入っている yum は、これがダメなのかもしれません。

ということで、チェックしたら、

# yum list yum
Loaded plugins: fastestmirror
base                                                     | 1.1 kB     00:00
extras                                                   | 2.1 kB     00:00
updates                                                  | 1.9 kB     00:00
Installed Packages
yum.noarch                    3.2.22-37.el5.centos                     installed
Available Packages
yum.noarch                    3.2.22-40.el5.centos                     base
#

古いじゃん。ということで、yum でアップデートしてから実行したのですが、やはり同じ。
yum コマンドだけの問題ではないようです。

じゃ、ということでそれぞれ個別に入れていきます。

# yum --enablerepo epel install perl-IPC-ShareLite.x86_64
...
# yum --enablerepo epel install perl-IPC-Cmd.noarch
...
# yum --enablerepo epel install perl-Log-Dispatch.noarch
...
# yum --enablerepo epel install rrdtool-perl
...
# yum --enablerepo epel install perl-XML-DOM
...
# yum --enablerepo epel install perl-Log-Log4perl
...
perl-Log-Log4perl-1.13-2.el5.noarch from epel has depsolving problems
  --> Missing Dependency: perl(IPC::Shareable) is needed by package perl-Log-Log4perl-1.13-2.el5.noarch 

(epel)
Error: Missing Dependency: perl(IPC::Shareable) is needed by package perl-Log-Log4perl-1.13-2.el5.noarch 

(epel)
 You could try using --skip-broken to work around the problem
 You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest

やっぱりこれは、perl のバグなのか?
念のため、perl のパッケージもアップしてみます。

# perl --version

This is perl, v5.8.8 built for x86_64-linux-thread-multi

# yum list perl
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.nara.wide.ad.jp
Installed Packages
perl.x86_64                     4:5.8.8-32.el5_7.6                     installed
Available Packages
perl.i386                       4:5.8.8-43.el5_11                      updates
perl.x86_64                     4:5.8.8-43.el5_11                      updates
# yum update perl
...

無事、バージョンアップ完了。とはいえ、perl 自体のバージョンは、v5.8.8 で変わらず。
やはり、

  --> Missing Dependency: perl(IPC::Shareable) is needed by package perl-Log-Log4perl-1.13-2.el5.noarch 

(epel)
Error: Missing Dependency: perl(IPC::Shareable) is needed by package perl-Log-Log4perl-1.13-2.el5.noarch 

(epel)

というエラーが発生します。

じゃ、ということで、ネットで検索したら見つかった IPC-Shareable の CentOS5 用のパッケージを入れてみる。


http://pkgs.repoforge.org/perl-IPC-Shareable/
rpm -ivh perl-IPC-Shareable-0.60-1.2.el5.rf.noarch.rpm

これを入れたら、yum –enablerepo epel install perl-Log-Log4perl が成功しました。
さらに、yum –enablerepo epel install munin もうまくいきました。

munin は、デフォルトでパスワードを聞いてくるのですが、認証なしで入れるようにしておきます。
/etc/httpd/conf.d の下にある munin.conf の認証関係をコメントします。
また、URLを「 http://localhost/munin/」で参照できるように、次の行を追加しました。


Alias /munin /var/www/html/munin

まあ、なんとかインストールはできた。
しかし、いろいろやりながらとはいえ、朝から初めてインストールが終わったのは夕方、というのはちょっと。
この CentOS 5.7 は、早く新しいのにリプレースしてほしい、と改めて思う。

私は、スタイルシートが苦手です。

私は、スタイルシートが苦手です。

今日もかなり痛い目にあいました。
昨日作ったWebページの整形用にと、スタイルシートを作り始めたところ、全く読んでくれない現象が発生しました。

最初にスタイルシートが読めなかった原因は、未だにわかりません。いろいろやっているうちに、気がつかずにHTML側で、HTML5 のフォーマットとHTML4 のフォーマットを混在させてしまい、混乱してしまいました。自分の作ったちゃんと動いているHTMLをコピーした際、混じってしまったようです。

最初は Windows 7 の IE11 ではじめたのですが、原因がわからず、Windows 版のChrome でやってみたり、最後は CentOS 付属の FireFox でやっても原因不明。
かれこれ2時間近くを無駄にしました。

結局、HTMLをゼロから作り直して、突然うまくいくようになったのでほっとしました。しかし、午前中早い時間にとりかかったはずなのに、作業をはじめられたのはお昼です。スタイルシートの編集は、それでなくとも解りにくい点が多いので、ネットで調べながらで進まないのに、これでは。。。

目標とする絵にはなったのですが、最後の最後で固定したはずのテーブルのセルのサイズが変わっているし。FireFox で作業してて、最後に IE で確認したのがまずかったかな。すごく簡単な表だけなのに、まだまだ、完成にはほど遠い。

世の中の人は、いったいどうやっているんだろう、と思った瞬間でした。

WordPress のデータベースは、最初の案でOKでした。
データベースを作ると児童でいくつかのテーブルが作られるのですが、今回はそのうちのwp_posts を使います。ブログとして準備しているものの中で、指定した日に投稿された記事の一覧を作ったのですが、WordPress は、作成日と修正日の2つの日付を持っています。今回は、作成日の日付を使いました。

アップロードした画像や、自動でセーブした分も wp_posts に格納されるので、1つの記事のみ作成したとしても、かなりのデータが入ります。今回は、投稿された記事のみをカウントの対象としました。

WPのDBを調べてます

派遣先で運営しているブログのサポートのため、どれだけの記事が投稿されているか、簡単に確認できるページを作成中。

その過程で、WordPrsssのデータベースをいろいろと見てます。
簡単に、post された記事の日付だけとってきて最新のだけ扱えば簡単だろうと思っていたのですが、なかなかとっつきにくいデータになってます。

使うだけなら簡単なんですけどね。

今日半日かかって簡単なものを作ったのですが、もう少しデータ構造を調べてみて、ほんとにこの情報でいいか、見直ししないと。

SQLサーバーのトラブル

派遣先で、また、サーバー関係のトラブル発生。
経理のシステムが応答していないとのこと。

このシステムも保守業者がサーバーもソフトも設定しているので、ネットワーク系の不具合以外は基本的に何もできない。

とりあえず、コンソールに何か出てないか見に行くと、サーバーは正常に稼動しているっぽい。
しかし、日付が今日に変わってすぐに実行されるバックアップが動いていない。
昨日の夕方までは正常に稼動していたので、昨日の誰もいない時間帯に、何か不具合があったと予想される。

いつものようにイベントビューアでシステムに何か出ていないか確認する。
すると、警告がたくさん出ていた。

結論から言ってしまえば、バックアップのタイミングにメモリー不足が発生し、それ以降、データベースが正常に動作していない。

データベースは、Microsoft の SQL Server ですが、メモリ関係の設定が抜けているか、無謀なSQLを実行するため物理メモリぎりぎりに設定しているか。まあ、いろいろな理由があるのでしょうが、動作しないのでは意味がない。

保守会社に連絡を取り、確認を依頼しました。
まず、使えるようにサーバーをリブートしたようです。

まだ、どうすることになったか正式なコメントは聞いてないが、確認にやってきた若いエンジニアは、また同じようになったらリブートしてみてください、と言ったとか。おいおい...。

bus0107-003

Excelでちょこちょこっと

派遣先で、久々に Excel のワーク。

Webの管理画面に表示されたEメールのリストから、IDと氏名、所属を至急調べてくれ、というもの。

名簿は Excel のシートで用意されているので、Eメールアドレスをキーにして、vlookup で簡単にできる件。

名簿のシートをワーク用の Excel にコピーし、A列に1列挿入してEメールアドレスをコピーする。(というか、=[セル場所] で簡単にコピペ)
調査対象のEメールのリストをシートに取り込んでおく。
ワーク用新しいシートを準備して、調査対象のEメールをA列にコピー。
(というか、=[取り込んだシート.該当セル] でリンクをはった状態)
表示する情報を、下記の式で準備。
=vlookup(A2,名簿シート.\A2:\Z2,??,false)
あとは、調査対象分だけコピーすれば準備OK。

今回は、所属毎にソートしたので、別シートにコピーして並べ替えしてから関係者にEメールで送付しました。

作業時間5分くらいですが、所属がわかると対策しやすい、とまあよくできたかも。
(メールの文章を書くほうが、面倒だった。)

MYSQLは久しぶり

以前勤めていた会社で Linux 用のデータベース管理システム PostgreSQL を使っていたので、慣れていると思ったのですが、ちょっと自信をなくす事態が。

今勤めている大学では、WordPress で MySQL を使っており、他にも外部に作成を依頼したシステムでフリーのデータベースを利用しているようです。
MySQLなんて、PostgreSQL とあまり変わらないと思っていたので、ちょこちょこ使うにはいいかなと思い、手をだしたところ、はまってしまいまいした。

テーブル名や要素名を日本語にしたのが敗因です。
前の会社で見た、Windows Server に実装した Oracle Database 用の日本語のテーブルがわかりやすくていいな、と思っていたので、日本語を使ってしまいました。
(PostgreSQLを使うときは、テーブル名や要素名を英語にしていました)

次のミスがあり、エラーでまくりです。

(1) /etc/my.cnf に、[mysql]の文字設定記述が抜けていた。
[client]と[mysqld]だけに設定していて、PHP で作ったWeb画面では文字化けしてなかったのですが、コマンドラインからはだめみたいです。

(2) 「’」でくくる必要はなかった
ネットで調べたらテーブル名や要素名に日本語を使った場合は、「’」でくくるといい、という記事を見つけたので、そのとおりにしたらエラーになった。CentOSでやる場合は、不要です。

(3) 要素名を改行で区切っただけではダメで空白が必要
テキストファイルに「,」で区切って、直後に改行を入れたSQLを作ったのですが、「,」と改行だけではだめで、「,」と改行の間に半角の空白が必要でした。

(4) 空白が2バイト文字だったりする
テキストエディタでSQLを作った際、半角の空白と倍角の空白が混じってしまい、倍角の空白でエラーになっていました。もちろん半角の空白にすれば問題ありません。

(5) 予約もつい使ってしまった
日本語がだめで英語で要素名を作った際、予約語をそのまま使ってしまい、そのためエラーになってしまった。安易な命名はやはりダメでしょうね。

これを根気強く直すと、動くようになりました。このエラーメッセージ、解りにくいですね。
違うエディタで確認すればすぐ解ったようなミスもあったので、やり方も見直した方がいいかな。
(試しに、と思ったので vi でさらさらっと書いたのが、結局敗因だったのかも。)

MAC OSサーバーのトラブル再度

今勤めている大学のある学科で使っている MAC OS を使ったサーバーで、また、原因不明の応答不能が発生し、呼ばれました。

今の MAC OS は、BSD系のUNIX カーネルと使っているので、昔のUNIXサーバーと同じように使える?、と思っていてはダメだんでしょうね。かなり独自の機能があるようです。

システムログを見せてもらったのですが、クラッシュログが幾つかありました。

正直言うと、こういうクラッシュログを採取して、ソフトを保守する担当者に送ったことは何度もあるものの、ログを解析したことは無い。あの、メモリーのアドレスが書かれたリストを見ても、何をやっていたのかは解らない、というのが正直なところ。

ハード系の障害なら、そのものずばりがログに出ているので簡単なんですが。ソフト系のトラブルはハードルが高い、という気がしています。それでも、アプリケーションではなくOS付属のデーモンなどがクラッシュしていると、大抵は何をやっていたかはわかるので対策も立てやすい。

今回の MAC OS のサーバーも、クラッシュしたアプリがいくつかありました。
ところが、他人が設定した、ドキュメントもろくにないサーバーを調べるのは、ちょっと無理かもと思わせる現象が。

クラッシュしてたのは、smbd と cloudd の2つ。
smbd は、このサーバーがファイル共有のためのものだと聞いていたので、よく使われるものでしょう。クラッシュログには、キャッシュにアクセスできなくなったとも出ていました。HDDの容量も怪しいかもしれません。
もう1つの cloudd は、????
うわさの iCloud 関係のものかもしれない。(私はこの機能を使ったことがありません)
smbd のクラッシュに巻き込まれていっしょにクラッシュしたのかも。

使われているOSが、10.10.2 ということで、この辺をググルと、いろいろと障害が出てきました。
iCloud を有効にしてて、大きなファイルを扱うとCPUを使い切るほど負荷がかかるとか。メモリーのかなりの部分を使ってしまうとか。

これっぽいな、と思ったので、サーバーを使っている担当者に話だけさせてもらいました。
どうも、サーバーということで複数の人が触れて、OSのパッチとかもなおざりになっているようです。
個人的には、OSのパッチを当てて、iCloud の設定をオフにすれば再発しないと思います。

また、問い合わせがあったら、もう少し助言できるよう、勉強しておきます。

http://photoshopvip.net/file/2010/06/mac_telado_es_post.jpg