2011年12月23日金曜日

ブログの移転

自宅サーバーでブログを始めました。

少年から大人へ
↑こっちでメインに書いていきます。

2011年9月13日火曜日

ディレクトリごとの設定ファイルを使う(.htaccessファイル)

Apacheを利用して、ユーザごとの公開ディレクトリを用意することができます。さらに、/home/user/public_html といったユーザの公開ディレクトリに対して、各々の設定をしたい。例えば、あるユーザの公開ディレクトリに対して、特定のディレクトリで SSI を有効にしたい、ということがあるでしょう。.htaccessファイルを使って実現することができます。

① Apacheの設定ファイル(httpd.con)から下のように ”AllowOverride All” を追加する
<Directory /home/*/public_html>
AllowOverride All
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec                   
# <Limit GET POST OPTIONS>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS>
# Order deny,allow
# Deny from all
# </LimitExcept>
</Directory>

② Apacheの設定ファイルから、デフォルトの設定ファイル名(.htaccess)を確認しておく
AccessFileName .htaccess                           
 
③ 設定したいユーザ(hoge)の公開ディレクトリに移動して、設定ファイルを作成
[hoge@www~]$ cd ~/public_html/
[hoge@www public_html]$ vi .htaccess

④ .htaccessファイルに利用したい設定を記述する


しかし、AllowOverrideの設定を有効にする場合、サーバへの負荷が増加します。
そのことから、.htaccessファイルの使用は極力避けた方がよいです。
http://httpd.apache.org/docs/2.2/ja/howto/htaccess.html

Apacheの設定ファイルをいじれる(rootアクセス権限を持っている)のであれば、その設定ファイルに、設定を変更したいディレクトリを指定してあげるのがベストです。実際、.htaccessファイルに書くことで実現する設定は、Apacheの設定ファイルの<Directory> セクションを使って実現することができるし、その方が良い設定方法みたいです。

HTML::Templateを使って認証プログラムを作成

HTML::Templateを使用することで、外部に用意してあるHTMLをCGIスクリプトの中に読み込むことができます。HTMLデザインとスクリプトを明確に分離することで、メンテナンス性が高まります。ただし、HTML::Templateは標準モジュールではないので、CPANを使ってインストールする必要があります。

今回はHTML::Templateを使って、簡単な認証プログラムをかきました。
ID/PWに guest/guestと入力してログインボタンをクリックすれば、ログイン後のhtmlページを表示します。

%2525E3%252582%2525B9%2525E3%252582%2525AF%2525E3%252583%2525AA%2525E3%252583%2525BC%2525E3%252583%2525B3%2525E3%252582%2525B7%2525E3%252583%2525A7%2525E3%252583%252583%2525E3%252583%2525882011-09-1321.59.13-2011-09-13-21-05.png


enter.tmpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">           
</head>
<body>
<div align="center">
<form action="login.cgi" method="post">
<b>認証</b></br>
ID : <input type="text" name="id" ><br><br>
PW : <input type="password" name="pw" ><br><br> 

<div align="center">
<input type="submit" name="login" value="ログイン">
</div>
</form>
</body>
</html>

login.cgi
#!/usr/bin/perl

# モジュール宣言
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use HTML::Template;

# ユーザのID/PW
my %user = ( "guest" => "guest" );

# CGIオブジェクトの生成
my $cgi = new CGI();

# ログイン処理
if ($cgi->param('login')) {       
        &login;
}
&enter_form;

#---------------------------------------------------------------------
# ログイン認証
sub login {
        # idのパラメータ取得
        my $id = $cgi->param('id');
        # pwのパラメータ取得
        my $pw = $cgi->param('pw');
       
        # id/pwがguest/guestならば、test.htmlを表示
        if ($id eq "guest" and $pw eq "guest") {
                print "Content-type: text/html\n";
                print "Location: ./test.html\n\n";
               
        }
}

# HTML::Templateを使用してログイン画面表示
sub enter_form {
        # HTML::Templateオブジェクトを作成
        my $tmpl = HTML::Template->new(filename => 'enter.tmpl');               
        # HTMLの出力
        print "Content-type: text/html\n\n";
        print $tmpl->output;
}        

今回は同ディレクトリに、HTMLテンプレートとCGIスクリプトを実装しましたが、テンプレートファイルはWebクライアントが直接アクセスできないディレクトリに配置するのが普通みたいです。

それと、CGIスクリプトの中にID/PWを記述するのではなく、隠しファイル等を使って、Webクライアントがアクセスできないディレクトリに配置しておかないとダメです。

2011年8月30日火曜日

Tomcatのスレッドダンプを取得する(Windows)

スレッドダンプは、実行中のスレッドスタックを取得できるため、解析するのに最適です。
Tomcatのスレッドダンプの取得方法は色々ありますが、Windowsだと、Tomcat管理用のアイコンを右クリックして、”Thread Dump”を選択するのが簡単です。

PastedGraphic-2011-08-30-22-56.jpg


- Tomcatをexeファイルでインストールした場合
右下のタスクトレイにTomcat管理用アイコンが現れますが、無い場合は、
スタート>全てのプログラム>Apache Tomcat>”Monitor Tomcat” を選択すると、右下にTomcat管理用アイコンが現れます。

- zipファイルを使ってインストールした場合
${Tomcatのディレクトリ}/bin に移動して、下記のコマンドで、Tomcat管理用アイコンが現れます。
> tomcat7w.exe //MS//


スレッドダンプは、${Tomcatのディレクトリ}/logs の下の “”tomcat7-stdout.{年月日}.log の中に出力されます。

2011-08-30 22:58:58 Commons Daemon procrun stdout initialized2011-08-30 23:01:37
Full thread dump Java HotSpot(TM) Server VM (20.0-b11 mixed mode):

"http-8080-2" daemon prio=6 tid=0x1854c400 nid=0x2d04 in Object.wait() [0x1a54f000]               
java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x03ee2648> (a org.apache.tomcat.util.net.AprEndpoint$Worker)
        at java.lang.Object.wait(Object.java:485)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.await(AprEndpoint.java:1621)
        - locked <0x03ee2648> (a org.apache.tomcat.util.net.AprEndpoint$Worker)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1646)
        at java.lang.Thread.run(Thread.java:662)

・・・省略・・・

2011年8月27日土曜日

VNCサーバのインストール

VNCを導入すること、ネットワークで接続された別の機器のグラフィカル画面を利用できます。例えば、WindowsからLinuxをCUIで操作することや、オフィスでの作業をそのまま自宅で引き継ぐといった利用もできます。

実際に、CentOSにVNCサーバをインストールして、WindowsからCentOSに接続してみます。


VNCサーバ (CentOS) の設定
① VNCサーバをインストール
# yum install vnc-server

サービスの設定ファイルは、/etc/sysconfig/vncservers
サービスの制御スクリプトファイルは、/etc/init.d/vncserver

インストールした時点では、サービスの自動起動はされていないので、VNCサービスを自動起動したい場合には設定しておきましょう。
# chkconfig --level 2345 vncserver on


② VNCサーバの設定
- ディスプレイ番号とユーザの設定
VNCサーバを利用するに、どのディスプレイ番号で、どのユーザのアクセスを許可するかを設定します。

/etc/sysconfig/vncservers
VNCSERVERS=“1:user”
VNCSERVERARGS[1]=“-geometry 1024x768 -nolisten tcp -localhost"       

VNCSERVERSには、ディスプレイ番号とユーザのリストを設定します。
ディスプレイ番号は、起動するXサーバのディスプレイ番号と関連付けられています。

オプション
-name <string>       VNCクライアントで表示される表示名<string>を指定  
-geometory <width>x<height> 横<width>と縦<height>の画面
-depth <depth> 表示ピクセル<depth>の設定
-pixelformat <format> サーバが使用するpixelフォーマットの指定
-cc 3 PseudoColorを使用
-nolisten tcp TCP経由でVNCサーバにアクセスを禁止
-nohttpd WebベースのVNCクライアントの禁止
-nolocalhost リモート接続で、セキュアトンネルを利用していないものを禁止

VNCサーバとXサーバは多くのメモリを使用するので、不要なVNCサーバを起動すると、システムの利用可能なメモリを圧迫するので注意。


③ ユーザ環境の設定
VNCサーバを接続するには、接続用のパスワードが必要です。サービスの起動の前に、必ず各々のユーザでパスワードを設定しおきましょう。

# su - user
$ vncpasswd
Password:
Verify:


④ サービスの起動
# service vncserver start


VNCクライアント (Windows XP) から接続
⑤ Windows XP にVNCをインストールする 
http://whzat.dyns.net/textbook/vnc/ を参考に、WindowsへVNCをインストール

⑥ビューワを起動
サーバを指定する

WS000008-2011-08-27-09-04.JPG


⑦ VNCサーバであるCentOSのデスクトップ画面が見れることを確認

WS000009-2011-08-27-09-04.JPG


2011年8月22日月曜日

hostsによる名前解決

ダイナミックDNSを利用して、自宅のサーバの名前解決を行っている場合、外部からのアクセスをNAT+IPマスカレードを利用して実現していることが多いことでしょう。NAT+IPマスカレードは、自宅サーバのサブネットのWAN側のIPアドレスに対する外部からのアクセスを処理しています。

しかし、NAT+IPマスカレードの特性上、同じサブネットでは名前解決で問題が起こることがあります。どんな問題かというと、
①同じサブネットにあるクライアント機で、稼働しているサーバ(hoge.com)にアクセスしようとする
②外部のDNSサーバから 「“hoge.com”のIPアドレスは、”200.100.100.10”だよ」と名前解決情報がクライアント側に渡される
③そのIPアドレスで再度アクセスを試みる

ここで問題が起こります。教えられた”200.100.100.10” はそのサブネットのWAN側のIPアドレスなので、アクセスできません。同じサブネット内のサーバにアクセスするには、プライベートIPアドレスの”192.168.11.10”でアクセスしなければなりません。

つまり、WANに設置されたDNSサーバを利用すると、同じサブネット内のパソコンからはアクセスすることができないのです。

この問題における解決策はいくつかあります。
・WAN空間のプロキシサーバを利用する
・LAN内では常にプライベートIPアドレスを利用する
・hostsファイルを利用する
・LAN専用のDNSサーバを構築する

今回は、hostsファイルを利用した名前解決を紹介します。


hostsファイルを利用する
hostsファイルは、FQDNとIPアドレスとの対照を記述したテキストファイルです。通常、hostsファイルは、外部のDNSサーバよりも先に参照されます。

サーバ情報
ホスト名:hoge.com
IPアドレス:192.168.11.10

■MacOS(クライアント)から、サーバ(hoge.com)への名前解決
1. MacOSのターミナルを起動
2. 下のコマンドをたたいて、記述
$ vi /etc/hosts
192.168.11.10   hoge.com                            


■Windows XP(クライアント)から、サーバ(hoge.com)への名前解決
1. C:¥windows¥system32¥drivers¥etc¥hosts を開く
2. 下記を追加
192.168.11.10   hoge.com                            

WS000007-2011-08-22-02-17.JPG


これでhostsの設定は終わりです。

注意すべきことは、hostsファイルを設定したPCをサブネットマスクの外へ持ち出すときは、設定を無効にしておくことです。外部からhoge.comにアクセスしても、名前解決としてプライベートアドレスが渡されるので期待通りのアクセスができなくなります。


参考)
自宅内DNSサーバーの構築
http://www.obenri.com/_dnsserver/index.html

2011年8月14日日曜日

パスワードファイルを使ったユーザ認証

あるWebページを特定のユーザにだけ公開することができます。流れは下記の通りです。
①認証が必要なページを見せるようにWebサーバへリクエストを送る
②Webサーバは、WWW-Authenticateヘッダを含むレスポンスを返す
③ユーザ側のブラウザがそれを検知して、ユーザ名とパスワードを入力するダイアログボックスを表示
④ユーザがユーザ名とパスワードを入力して、Webサーバに再びリクエストを送信
⑤Webサーバはパスワードファイルを参照して、認証成功ならページをユーザへ送る


■パスワードファイルを作成する
下のコマンドを使います。
# htpassed ${オプション} ${ファイル名} ${ユーザ名}

例)
# htpasswd -c /etc/httpd/.htpasswd user1
New password: ****                                   
Re-type new password: ****
Adding password for user user1


■ページ(secret.html)にユーザ認証の設定をする
Apacheの設定ファイル(httpd.conf)に下記を追加する
<Files secret.html>                                 
# 認証タイプの指定
AuthType Basic
# パスワードファイルの場所
AuthUserFile /etc/httpd/.htpasswd
# ダイアログボックスのメッセージの指定
AuthName "Certification"
#アクセス制御の指定
require valid-user
</Files>


Apacheを再起動した後、ブラウザからsecret.htmlにアクセスすると、下の画面のようにユーザ認証します。

%2525E3%252582%2525B9%2525E3%252582%2525AF%2525E3%252583%2525AA%2525E3%252583%2525BC%2525E3%252583%2525B3%2525E3%252582%2525B7%2525E3%252583%2525A7%2525E3%252583%252583%2525E3%252583%2525882011-08-1421.50.45-2011-08-14-21-26.png

パスワードファイルの作成で、追加したユーザとパスワードを入力して、ページが見れることを確認しました。

2011年8月13日土曜日

Cygwinを使って、Linuxサーバにsshコマンドで接続する

WindowsでUnix系のコマンドを使うのにCygwinはとても便利です。
さて、Cygwinを使って、Linuxサーバにssh接続したい。

$ ssh [ホスト名]
ssh: connect to host [ホスト名] port 22: Connection refused

けられた・・・

下のコマンドを実行すればいいです。
$ ssh-host-config -y

これで無事Linuxサーバへssh接続できます。

参考)
http://osksn2.hep.sci.osaka-u.ac.jp/~naga/miscellaneous/winssh/winssha-4.html

2011年8月11日木曜日

BINDをインストール

CentOSでは、DNSを実装した代表的なソフトウェアのBINDが使えます。
BINDは用途が広く、マスターターバ・スレーブサーバのいずれでも動作します。またローカルなDNSサーバとしても機能することができます。


■パッケージのインストール
# yum -y install bind
# yum -y install bind-chroot
# yum -y install caching-nameserver

bindパッケージは、DNSサーバを構築するために必要です。
サービス名はnamed。インストールした時点では、自動起動されない設定になっています。

bind-chrootパッケージは、BINDが参照するファイルシステムのルートが、/var/named/chroot にあるように見せることで、悪意のある第三者に攻撃されても、システムのファイルに影響が及ばないようにします。

chaching-nameserverパッケージは、自ホスト内で発生する様々な名前参照の問い合わせ結果を、DNSサーバのシステム内にキャッシュするためのものです。


■bind-chroot
bind-chrootパッケージをインストールすることで、nameedが使用するファイル全てが、/var/named/chroot以下にコピーされます。これまで標準的に存在していたファイル(ex. /etc/named.conf)は、/var/named/chroot以下のファイルのシンボリックリンクとして残されます。
例)初期設定ファイル : /etc/named.conf ⇒ /var/named/chroot/etc/named.conf


■サービスの起動
# /etc/init.d/named start
もしくは
# service named start

デフォルトでは自動起動される設定になっていません。
# chkconfig --list named
named 0:off 1:off 2:off 3:off 4:off 5:off 6:off

自動起動の設定
# chkconfig --level 345 named on


■初期設定ファイル
bind-chrootをインストールしたものとして話を進めます。
BINDは、/etc/named/chroot/etc/named.confを初期設定ファイルとして使用します。BINDにおいて、ステートメントとして定義されているのは12個あります。logging, options, zone, acl, key, trusted-keys, server, controls, include, masters, lwres, viewです。そのうち、重要となるのは、optionsとzoneです。

named.conf
# cat named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

# namedの動作に関する基本的な設定を行うoptionsステートメント
options {
 # namedがどのアドレスとポートでリクエストを受け付けるかの指定
        listen-on port 53 { 127.0.0.1; };
        # namedがどのアドレスとポートでリクエストを受け付けるかの指定(IPv6用)
        listen-on-v6 port 53 { ::1; };
        # マスターファイルの置き場所の指定
        directory         “/var/named”;
        # rndcコマンドのdumpdb命令で、namedがキャッシュしているデータをダンプする場合に出力されるファイル名
        dump-file         “/var/named/data/cache_dump.db”;
        # rndcコマンドのstats命令で、統計情報を出力する場合に出力されるファイル名
        statistics-file “/var/named/data/named_stats.txt”;
        # namedが終了時にメモリの使用統計を出力されるファイル名
        memstatistics-file “/var/named/data/named_mem_stats.txt”;
        # DNSサーバに問い合わせできるクライアントを限定する指定
        allow-query { localhost; };
        # 再帰的なクエリの許可
        recursion yes;

        # DNSSECの有効の許可
        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file “/etc/named.iscdlv.key”;
};

# BINDのログ出力方法の設定を行うloggingステートメント
logging {
channel default_debug {
file “data/named.run”;
severity dynamic;
};
};

# ルートドメインに相当するゾーンの設定を行うzoneステートメント
zone “.” IN {
        type hint;
        file “named.ca”;
};

# includeで指定されたファイルの情報を設定として読み込む
include “/etc/named.rfc1912.zones”;


■named.rfc1912.zone
RFC1912で定められたDNSサーバとして必要最小限のDNSレコードを設定するための設定ファイルです。

named.rfc1912.zone
# cat named.rfc1912.zones
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
// and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt
// (c)2007 R W Franks
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

# localhost.localdomain というホスト名を参照するための設定
zone “localhost.localdomain” IN {
        type master;
        file “named.localhost”;
        allow-update { none; };
};

# localhost というホスト名を参照するための設定
zone “localhost” IN {
        type master;
        file “named.localhost”;
        allow-update { none; };
};

# ローカルループバックゾーンのIPv6用の逆引き
zone “1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa” IN {
        type master;
        file “named.loopback”;
        allow-update { none; };
};

# ローカルループバックゾーンの逆引き
zone “1.0.0.127.in-addr.arpa” IN {
        type master;
        file “named.loopback”;
        allow-update { none; };
};

# 0.0.0.0 に対する逆引き処理のための設定
zone “0.in-addr.arpa” IN {
        type master;
        file “named.empty”;
        allow-update { none; };
};


■設定の反映
# service named reload


参考)
・『CentOS5 で作るネットワークサーバ構築ガイド』
・自宅内DNSサーバーの構築 http://www.obenri.com/_dnsserver/named_conf.html

2011年8月10日水曜日

smbclientを使ってフォルダごとダウンロード

■ファイルをダウンロード
getを使うことでサーバのファイルをローカルへダウンロードできます。
スクリプトとして実行することを考慮して、下のコマンドが使えます。

# smbclient ‘\\サーバのホスト名\共有フォルダ’ [アクセスパスワード] -U [アクセスユーザ] -D [ディレクトリの移動] -c "prompt;recurse;mget [フォルダ名]”

例)
# smbclient '\\shindowsxp\tmp' “guestpass” -U guest -D "\20110810" -c "prompt;get test.txt"
Domain=[SHINDOWSXP] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]
getting file \20110810\test.txt of size 12 as test.txt (5.9 KiloBytes/sec) (average 5.9 KiloBytes/sec)


■フォルダをダウンロード
では、フォルダごとダウンロードするにはどうすれば良いのでしょうか。
prompt;get を prompt;recurse;mget とすれば実現できます。
スクリプトとして実行することを考慮して、下のコマンドが使えます。

# smbclient //サーバのホスト名/共有フォルダ [アクセスパスワード] -U [アクセスユーザ] -D [ディレクトリの移動] -c "prompt;recurse;mget [フォルダ名]”

例)
# smbclient '\\shindowsxp\tmp' “guestpass” -U guest -D "\20110810" -c "prompt;recurse;mget test"
Domain=[SHINDOWSXP] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]
getting file \20110810\test\test.txt of size 12 as test.txt (5.9 KiloBytes/sec) (average 5.9 KiloBytes/sec)


■参考
- smbclientコマンド - 管理者必見(コマンドのオプションが詳しくかかれています)
http://itpro.nikkeibp.co.jp/article/COLUMN/20070618/275055/
- WindowsサーバをUnixから使う(smbclientをスクリプトとして使いたい人向き)
http://renchan.dyndns.tv/itblog/306