2010年11月10日水曜日

Ubuntu 10.10 + mozc

Ubuntu 10.10では日本語入力はiBus経由なので、デフォルトではiBus + Anthyという
組み合わせになっています。

ちょっと使ってみたところ、いまいち安定してないなぁという印象だったので、
mozc(Google 日本語入力のOSS版)をいれてみることにしました。

パッケージはUbuntu標準で用意されているので、簡単にインストールできますが、
ひとつだけ罠がありました。

このリリースノートの一番最後に書いてありますが、mozcにすると、1つのCPUを
100%消費するというバグがあります。
http://www.ubuntulinux.jp/News/ubuntu1010-desktop-ja-remix

 私のマシンでも再現しましたが、幸いにもCore 2 Duoだったので、もうひとつのCPUで
作業することができましたが、シングルコアのマシンだと大変だったかもしれません。

対策は、上記にも記載されていますが、パッチを当てると良いようです。
/usr/share/ibus/ui/gtk/panel.pyの66行目と67行目を直接修正しておけば
とりあえずは大丈夫でした。

参考までに。

Ubuntu10.10 + 日本語対応 unzip

Ubuntu10.10では、シフトJISのファイル名が含まれるzipファイルをunzipコマンドで
展開したときに、ファイル名が文字化けする。

この問題を解消するunzipパッケージは下記から入手可能。
ftp://ftp.kddilabs.jp/pub/Linux/distributions/ubuntu-jp/archive/ubuntu/pool/main/u/unzip

64bit版 : unzip_6.0-5~5.52~ja1_amd64.deb
32bit版 : unzip_6.0-5~5.52~ja1_i386.deb

なお、Ubuntu 10.10 日本語Remix CDを使ってインストールした場合は、このunzipが
標準で含まれている模様。

2010年11月9日火曜日

Ubuntu10.10でKVM + ブリッジ接続

Ubuntu10.10でKVMを使うときに、ネットワークのブリッジ接続を利用するために
/etc/network/interfacesを下記のように設定した。

-----
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual
up /sbin/ifconfig eth0 promisc

auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_maxwait 1
-----

設定後にネットワークを再起動しておく。
# /etc/init.d/networking restart

これで、eth0の代わりにbr0にDHCPのIPアドレスが割り当てられ、
仮想マシンをbr0で接続することでブリッジ接続で利用することが可能になる。

2010年11月5日金曜日

OpenLDAP 検索時のDNの正規化

OpenLDAPに登録したエントリのDNに全角のアルファベットなどが含まれている時、
検索時に小文字のアルファベットでもマッチします。

例えば、「uid=テストA,dc=example,dc=com」 (Aは全角) が登録されている時、
「uid=テストA,dc=example,dc=com」(Aは半角)を登録することができません。

これは、検索時に検索条件として使われる「caseIgnoreMatch」や「caseExactMatch」などの
条件を処理する場合には、DNを正規化して処理するため、この2つが同一とみなされるためです。

例えば、caseIgnoreMatchは次のように定義されています。
servers/slapd/schema_init.c

        {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, directoryStringSyntaxes,
                NULL, UTF8StringNormalize, octetStringMatch,
                octetStringIndexer, octetStringFilter,
                directoryStringApproxMatchOID },

この「UTF8StringNormalize」が正規化処理を行う場合に呼ばれる関数です。

OpenLDAPが文字を扱う場合に利用しているUnicodeでは、「全角のA」と「半角のA」は
正規化すると、同じ「半角のA」として扱われます。

エントリの検索時にはUTF8StringNormalizeで正規化した結果でDNの比較を行うため、全角アルファベットと半角アルファベットは同じ文字として扱われます。

ただしエントリの登録時には正規化されていないDNが登録されるため、
先に登録したDNがそのまま登録されます。

2010年10月15日金曜日

CentOS 5.5 で rsyslogを使ってMySQLにsyslogメッセージを書き出す

CentOS 5.5には、rsyslog、rsyslog-mysql、rsyslog-pgsqlなどのパッケージが
含まれており、syslogのログメッセージをRDBMSに簡単に記録することが可能になっています。
なお、RHEL6からは標準のsyslog機能がrsyslogになるようです。

以下はrsyslog-mysqlを利用するための手順です。
まず、rsyslogとrsyslog-mysqlパッケージをインストールします。
# yum install rsyslog rsyslog-mysql

標準のsyslogを停止し、自動起動を無効にします。
# /sbin/service syslog stop
# /sbin/chkconfig syslog off

mysql-serverパッケージがインストールされていない場合は、インストールします。
# yum install mysql-server

MySQLのサービスを起動します。
# /sbin/service mysqld start

MySQLに、ログ記録用のDBを作成します。
DB作成用のSQLは、/usr/share/doc/rsyslog-mysql-3.22.1/createDB.sqlに用意されています。

# mysql -u rootWelcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> source /usr/share/doc/rsyslog-mysql-3.22.1/createDB.sql

Query OK, 1 row affected (0.00 sec)

Database changed
Query OK, 0 rows affected (0.04 sec)

Query OK, 0 rows affected (0.01 sec)



データーベースとして、「Syslog」が作成されます。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Syslog             |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

syslogユーザー権限に、Syslogデータベースへの全権限を与えます。
mysql> grant all privileges on Syslog.* to syslog@localhost identified by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges
mysql> quit


/etc/rsyslog.confをMySQLに全てのログメッセージを送るように、以下の内容に変更します。
-----
$ModLoad ommysql.so
*.*    :ommysql:localhost,Syslog,syslog,password
-----
上記の設定内容では、localhostサーバーのMySQLのSyslogデータベースに、syslogユーザー(パスワード:password)で接続するという内容になります。

パスワードが記載されていますので、ファイルのモードを変更しておきます。
# chmod 600 /etc/rsyslog.conf

設定完了後、rsyslogサービスを起動します。
# /sbin/service rsyslog start

loggerコマンドで、syslogメッセージを記録してみます。

メッセージを確認するため、DBの内容を確認します。

# mysql -u syslog Syslog -p
Enter password: ********   ← syslogユーザーのパスワード





mysql> select ReceivedAt,Message from SystemEvents;
+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ReceivedAt          | Message                                                                                                                                                                                                                   |
+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2010-10-15 09:39:04 |  [origin software="rsyslogd" swVersion="3.22.1" x-pid="11773" x-info="http://www.rsyslog.com"](re)start                                                                                                                  |
| 2010-10-15 09:39:04 | WARNING: rsyslogd is running in compatibility mode. Automatically generated config directives may interfer with your rsyslog.conf settings. We suggest upgrading your config and adding -c3 as the first rsyslogd option. |
| 2010-10-15 09:39:04 | Warning: backward compatibility layer added to following directive to rsyslog.conf: ModLoad imuxsock                                                                                                                      |
| 2010-10-15 09:39:09 |  TEST Messages                                                                                                                                                                                                            |
+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

以上のように、rsyslogを使うことで、MySQLにsyslogメッセージを格納することができるようになりました。









2010年10月6日水曜日

Windows Server 2008をNTPクライアントとして設定する

コマンドプロンプトから、次のコマンドで設定する。

以下の例では、NTPサーバーが192.168.10.1とする。
C:\> w32tm /config /manualpeerlist:192.168.10.1 /syncfromflags:manual
C:\> w32tm /config /update   ← 変更を反映
C:\> w32tm /query /configuration   ← NTPが設定されていることを確認

2010年9月17日金曜日

CentOS 5.5でiSCSI利用時のshutdown処理

CentOS 5.5でiSCSIイニシエーターとしてiSCSIを利用すると、
shutdown時に、
Synchronizing SCSI cache for disk
のメッセージが出力されて、その後に電源断にいたらない。

ネットワークが切れているのに、iSCSIデバイスに対するsyncを実行しようとするための模様。
対策については、こちらが詳しいようだ。
http://www.asahi-net.or.jp/~aa4t-nngk/iscsi.html#cacheerronstdn

2010年9月10日金曜日

CentOS 5.5でGFS2を利用する

前回の記事で2台構成でクラスタサービスを起動しました。

今回は、iSCSIで提供されているディスクをGFSとして利用するための設定を行います。
iSCSIディスクの設定方法は、このあたりの記事を参照してください。

OSS EXPO - CentOS5.5でiscsi targetの設定
OSS EXPO - CentOS5.5でiscsi initiatorの設定

iSCSIディスクをgfs2形式にフォーマットします。

# /sbin/mkfs -t gfs2 -p lock_dlm -t samba:gfs01 -j 8 /dev/sda1
This will destroy any data on /dev/sda1.

Are you sure you want to proceed? [y/n] y
Device:                    /dev/sda1
Blocksize:                 4096
Device Size                29.53 GB (7741436 blocks)
Filesystem Size:           29.53 GB (7741436 blocks)
Journals:                  8
Resource Groups:           119
Locking Protocol:          "lock_dlm"
Lock Table:                "samba:gfs01"
UUID:                      6AE99ED2-B077-F77B-1CB3-6D9E55DD7E74


-pオプションはロック形式として、「lock_dlm」を指定します。
-tオプションはロックテーブル名として、「クラスタ名:ファイルシステム名」を指定します。クラスタ名は、cluster.confに指定したクラスタ名と一致しなければなりません。ファイルシステム名が16文字以内で他のファイルシステムと重複しない名前を指定します。
-jオプションはジャーナル数を指定し、クラスタを構成するサーバー数以上の数値を指定する必要があります。

ファイルシステムが作成されたら、mountします。
# mount /dev/sda1 /opt/gfs2

2台目のノードでも同様にマウントしますが、作成したパーティション(/dev/sda1)を認識していない場合は、いったん、iscsiサービスを再起動します。
# /sbin/service iscsi restart
# mount /dev/sda1 /opt/gfs2

両ノードの/etc/fstabに以下の設定でGFS2のデバイスを追記します。
/dev/sda1        /opt/gfs2        gfs2    _netdev    0 0

今回の環境では、ディスクとしてiscsiを利用しているため、ネットワーク起動後にマウントする必要があるため、「_netdev」を指定しています。

両ノードのgfs2サービスを起動します。
# /sbin/service gfs2 start
GFS2 ファイルシステムをマウント中:                         [  OK  ]

自動起動の設定として、cman、gfs2を有効にしておきます。
# /sbin/chkconfig cman on
# /sbin/chkconfig gfs2 on

以上でGFS2を利用する準備が完了です。

CentOS 5.5で2台構成のクラスタ(RHCS)

CTDBによるSambaクラスタ構成を試すために、まずは、CentOS5.5のRHCS + GFSによるクラスタ構成を構築します。
なお、運用環境でRHELを利用してRHCSのサポートを受けるためにはいろいろ前提条件があるようです。
Redhat - Red Hat Cluster Suiteで始めるフェイルオーバクラスタ

RHCSを利用する場合は3台以上のメンバーサーバーで構成することが推奨されていますが、今回はテスト環境なので2台で構成します。
 
サーバー1: samba351.lan.osstech.co.jp
サーバー2: samba352.lan.osstech.co.jp


今回は、system-config-clusterコマンドで設定してみました。
# system-config-cluster &

初めてコマンドを起動すると、次の画面が表示されますので、「Create New Configuration」をクリックします。

続いて、クラスタ名を入力します。クラスタ名は、ネットワーク内に同一の名前が存在しないようにします。今回は、「samba」にしました。
クラスタの設定を行います。
「Cluster Nodes」の「Add a Cluster Node」をクリックします。

1台目のノードをクラスタに追加します。

「Cluster Node Name」には、クラスタ監視のプライベートネットワークに割り当てたFQDNを指定します。
また、DNSが停止した場合にクラスタが停止することを避けるため、関係するFQDNは/etc/hostsに全て記載しておきます。
「Quorum Votes」は、障害時にどのノードが正常動作しているのか決定するための値に利用されます。

詳しくはこちらのサイトが参考になります。
eyes blog - RedHat ClusterとQuorum

1台目を登録したら、続けて2台目も登録します。

登録が完了すると、「Cluster node」に2台が登録されている状態になります。

次に「Fence Devices」を登録します。Fence Devicesとは、簡単にいうと、障害が起きたノードを強制的に電源OFFするための装置のことです。
 
なぜ「Fence Devices」が必要かは、こちらのブログが詳しいです。
eyes blog - Fencingについて

Fence Devicesを登録するために、「Fence Devices」を選択してから、「Add a Fence Device」をクリックします。

今回はテスト環境なので、デバイス一覧から「Manual Fencing」を選択し、適当な名前を設定します。

 作成したFence Deviceを各ノードに設定します。
「Cluster Node」のノード名を選択すると、右下に「Manage Fencing For This Node」のボタンが表示されますので、クリックします。

「Add a New Fence Level」ボタンをクリックします。


「Fence Level 1」が追加されますので、「Fence Level 1」を選択し、「Add a New Fence to this level」をクリックします。

Fence Deviceとして、先ほど作成したManual Fenceのデバイスが選択されていることを確認し、「OK」をクリックします。

Fence Deviceが登録されたことを確認し、2台目のノードも同じ作業を行います。


ここまでで、クラスタ構成に必要な最低限の設定は完了したので、メニューから設定を保存しておきます。設定内容は、/etc/cluster/cluster.confに保存されます。

作成したcluster.confは、2台目のノードにscpしておきます。

あとはクラスタを起動するだけですが、2台構成のクラスタの場合、1台目と2台目のcmanサービスをある一定期間内に起動する必要があります。

こちらのブログの説明が詳しいです。
eyes blog - Clusterを起動させましょう

なにはともあれ、1台目と2台目で次のコマンドを実行して、cmanサービスを起動します。

# /sbin/service cman start
 Starting cluster:
   Loading modules... done
   Mounting configfs... done
   Starting ccsd... done
   Starting cman... done
   Starting daemons... done
   Starting fencing... done
                                                           [  OK  ]

2台とも無事起動できたら、cman_toolsでクラスタの状態を確認しておきます。

# cman_tool status
Version: 6.2.0
Config Version: 2
Cluster Name: samba
Cluster Id: 3345
Cluster Member: Yes
Cluster Generation: 24
Membership state: Cluster-Member
Nodes: 2
Expected votes: 1
Total votes: 2
Quorum: 1
Active subsystems: 7
Flags: 2node Dirty
Ports Bound: 0
Node name: samba351.lan.osstech.co.jp
Node ID: 1
Multicast addresses: 239.192.13.30
Node addresses: 10.0.102.46

config-system-clusterの「Cluster Management」のタブに切り替えるとクラスタの動作状況を確認することも可能です。


CentOS 5.5でiscsi initiatorの設定

最初にiscsi-initiator-utilsパッケージをインストールします。 
 
# yum install iscsi-initiator-utils

iSCSIターゲットを実行しているサーバーを指定して、iSCSIディスクを探します。 
 
# iscsiadm -m discovery -t sendtargets -p 192.168.0.10
192.168.0.10:3260,1 iqn.2001-04.com.rhel6sv-iscsi-vol1


発見したiSCSIターゲット名を指定して、iSCSIターゲットに接続します。
 
# iscsiadm -m node -p 192.168.0.10 -T iqn.2001-04.com.rhel6sv-iscsi-vol1 -l
Logging in to [iface: default, target: iqn.2001-04.com.rhel6sv-iscsi-vol1, 
portal: 192.168.0.10,3260]
Login to [iface: default, target: iqn.2001-04.com.rhel6sv-iscsi-vol1, 
portal: 192.168.0.10,3260]: successful
  * -lオプションで指定したiSCSIターゲットにログイン
  * -uオプションで指定したiSCSIターゲットからログアウト
 
dmesgでカーネルのメッセージを確認すると、次のようにディスクとして
認識されていることが分かります。

 scsi1 : iSCSI Initiator over TCP/IP
  Vendor: IET       Model: Controller        Rev: 0001
  Type:   RAID                               ANSI SCSI revision: 05
scsi 1:0:0:0: Attached scsi generic sg0 type 12
  Vendor: IET       Model: VIRTUAL-DISK      Rev: 0001
  Type:   Direct-Access                      ANSI SCSI revision: 05
SCSI device sda: 61931520 512-byte hdwr sectors (31709 MB)
sda: Write Protect is off

今回の場合、/dev/sdaとして認識されていますので、あとは通常のディスクデバイスと
同じように利用します。
 

2010年7月23日金曜日

Samba 3.0からSamba3.2へのアップデート

Samba 3.0で構築したドメインコントローラーを、Windows 7やWindows Server 2008 R2対応などのために、Samba 3.2以降にアップデートする際の注意点。

Samba 3.0のドメインメンバーサーバーがある場合は、アップデートした、Samba 3.2サーバーのsmb.confの[global]セクションに"lanman auth = Yes"を追加する。
この設定を追加しない場合、Samba3.0のドメインメンバーサーバーの共有フォルダにアクセスすると、「現在、ログオン要求を処理できるログオンサーバーはありません」のエラーが表示されることになる。

Samba 3.2から、"lanman auth = No"にデフォルト値が変更されたため。





2010年7月9日金曜日

[Samba] Solaris10でsetgroups()

先日のSambaで所属グループ数の上限を超えて、setgroups()をするとpanicする問題について、対策用のパラメーターを追加したパッチを作成してみた。
パッチはこのあたりをベースに作成してみた。
http://groups.google.com/group/mailing.unix.samba-technical/browse_thread/thread/6accbc4250ccbab5?pli=1

setgroups()に失敗したときのセカンダリグループの権限がどうなるかだけど、指定したグループ数が上限を超えていると、setgroups()が「Invalid argument」のエラーになる。
このときは、setgroups()呼ぶ前と一緒の権限の状態になっているので、グループ数の上限を超えたときは、セカンダリグループの権限はまったく付与されないことを確認した。


2010年7月5日月曜日

CentOS 5.5でiscsiターゲットの簡単構築

iSCSIを利用すると、複数ノードから同時に利用できる共有ディスクとして利用することが可能です。 このときに、ディスク側のデバイスとしては、iSCSI対応のストレージを利用することもできますが、お手軽に試験などに利用したいときは、LinuxのiSCSIターゲット機能を利用することができます。 そこで、CentOS5.5で、iSCSIターゲットをお手軽構築する手順を説明します。

1. OSのインストール
CentOSインストール時に、後でiSCSIターゲットとして公開するためのディスク領域を空き領域のパーティションとして、あらかじめ確保しておきます。

2. iSCSI用ディスク領域の準備
fdiskなどで、iSCSIディスクとして利用するためのブロックデバイスを作成します。今回は、「/dev/sda3」としてブロックデバイスを用意しました。

3. scsi-target-utilsパッケージのインストール
yumコマンドでscsi-target-utilsパッケージをインストールします。依存関係パッケージも一緒にインストールする必要があります。

# yum install scsi-target-utils 

4. tgtdの起動
iSCSIターゲットの処理を行うtgtdを起動します。
# /sbin/service tgtd start 

5. iSCSIターゲット用ディスクの設定
iSCSIターゲットのディスクは、tgtadmコマンドで設定しますが、より簡単に作成するためのコマンドとして、tgt-setup-lunコマンドが用意されています。 tgt-setup-lunコマンドの詳細はmanで確認することができます。

# man tgt-setup-lun

今回は、/dev/sda3をディスクとして使用し、iSCSIイニシエーターとして、10.0.102.41と10.0.102.42から接続するため、次のコマンドを実行しました。 
# tgt-setup-lun -d /dev/sda3 -n iscsi-vol1 10.0.102.41 10.0.102.42
Using transport: iscsi
Creating new target (name=iqn.2001-04.com.iscsifs-iscsi-vol1, tid=1)
Adding a logical unit (/dev/sda3) to target, tid=1
Accepting connections only from 10.0.102.41 10.0.102.42

6. 動作確認
tgt-adminコマンドの-sオプションで、ディスクがiSCSIターゲットとして認識されていることを確認します。

# tgt-admin -s 

Target 1: iqn.2001-04.com.iscsifs-iscsi-vol1
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB
            Online: Yes
            Removable media: No
            Backing store type: rdwr
            Backing store path: None
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 153097 MB
            Online: Yes
            Removable media: No
            Backing store type: rdwr
            Backing store path: /dev/sda3
    Account information:
    ACL information:
        10.0.102.41
        10.0.102.42

8. /etc/tgt/targets.confの設定
再起動時に、自動的に上記の設定が有効になるように、/etc/tgt/targets.confに以下の設定を追加します。

<target iqn.2001-04.com.iscsifs-iscsi-vol1>
 backing-store /dev/sda3
 initiator-address 10.0.102.41
 initiator-address 10.0.102.42
</target>


7. tgtdの自動起動の設定
設定内容に問題が無ければ、マシン起動時にtgtdが自動起動するように設定しておきます。
# /sbin/chkconfig tgtd on


以上でCentOS5上でのiSCSIターゲットの構築は完了です。

2010年7月2日金曜日

[samba] 所属グループ数の制限を超えるとpanic

最近のSambaでは、setgroups()が失敗するとpanicとなるように実装が変更されていた。

smbd/sec_ctx.c
        if (sys_setgroups(gid, ngroups, groups) != 0 && !non_root_mode()) {
                smb_panic("sys_setgroups failed");
        }

この理由について、こちらで述べられている。
http://old.nabble.com/sys_setgroups-:-migration-issues-from-3.0-series-to-3.2-3.3-series-td23103672.html

要約すると、「setgroups()に失敗したままだと、実際にはグループの権限を持っていないためアクセスできるはずのファイルやディレクトリにアクセスできなくなるのに、それが分からずに問い合わせが多発するから。」ということ。

これが問題になりやすいのは、Solaris10の環境だと思う。
デフォルトだと、最大16グループなので、ファイルサーバー的な利用においては、あっという間に16グループに達する。
とりあえず、OSの/etc/systemに「set ngroups_max=32」を書けば32まで増やせるが、これでも足りない環境だと対策のしようがない。

Solaris10 + ZFS + Sambaを薦めたいときの、一番の弱点。

2010年6月30日水曜日

Movable TypeからBloggerへの移行

所有ドメインの更新時期が近づいてきたこともあって、レンタルサーバーに構築しているMovableTypeをどうするか考えた結果、GoogleのBloggerへ移行することに決定。

Bloggerを登録してから、次の手順で簡単にBloggerへ移行することができた。
  1.  Movable Typeのブログ管理画面から、「ツール」-「エクスポート」でMovable Typeのブログをテキストファイルのデータとして取り出す。
  2. http://movabletype2blogger.appspot.com/に、取り出したテキストファイルをアップロードして、convertする。
  3. できあがったblogger-export.xmlを、Bloggerのインポートでインポートする。
以上、15分ぐらいの作業だった。

2010年4月21日水曜日

PythonでPHPのopenssl_verify()相当の処理

PythonでPHPのopenssl_verify()の処理を実現しようとしたが、RHEL5に入っているM2Cryptoのバグにヒットした。

https://bugzilla.osafoundation.org/show_bug.cgi?id=7973

EVP.verify_final()に署名の情報を渡せないので、署名の検証が行えないというバグ。
最新版のM2Cryptoなら直っている。 2行ぐらい直すだけだけど。

openssl_verify()はこんな感じの実装になった。

def openssl_verify(data, sig, pubkeyfile):
rsa = M2Crypto.RSA.load_pub_key(pubkeyfile)
pubkey = M2Crypto.EVP.PKey()
pubkey.assign_rsa(rsa)
pubkey.reset_context()
pubkey.verify_init()
pubkey.verify_update(data)
return pubkey.verify_final(sig)



2010年4月9日金曜日

PythonでPHPのopenssl_seal()相当の処理を実現

PHPには、openssl_seal()が用意されていて、複数の受信者に対して、受信者ごとの公開鍵で暗号化したデーターを、一度に暗号化するインターフェースが用意されている。

これと同じことを、Pythonでやろうとすると、インターフェースが用意されていないので、M2Cryptoを利用してやる必要があるが、その方法がやっと分かった。

まず、opensslコマンドでテスト用に、公開鍵と秘密鍵を作成しておく。

$ openssl genrsa -out privatekey.pem
$ openssl rsa -pubout -in privatekey.pem -out publickey.pem


次にPythonの暗号化用のスクリプトで、データーを暗号化し、暗号化したデーターと、エンベロープキーをゲットする。

#!/usr/bin/python

import M2Crypto
import M2Crypto.Rand
import M2Crypto.RSA
import base64

PUBKEY = "publickey.pem"
message = "Hello World!"

pubkey = M2Crypto.RSA.load_pub_key(PUBKEY)
randdata = M2Crypto.Rand.rand_bytes(16)
msg = pubkey.public_encrypt(randdata,M2Crypto.RSA.pkcs1_padding)
print "== envelope key (Base64 encoded) =="
print base64.b64encode(msg)

cipher='rc4'
iv = ""
enc = M2Crypto.EVP.Cipher(cipher, randdata, iv, M2Crypto.encrypt)
data = enc.update(message)
data += enc.final()

print "== encrypted data (Base64 encoded) =="
print base64.b64encode(data)


これを実行すると、次のような結果が得られる。

== envelope key (Base64 encoded) ==
NIBGzm6ijGFjtruyVO4QDBGiWNu1bgJvJPlkY5kmCNLKEuabiBytsjRfOKZb7w4jsSnCrUREeCPHwa7SLMVceNQf6iWyE22RS6tAMVvzFBrKjXwNCZ+pU4v4pCQPTI+vZg7B/QcajR832hmBcG0NF8LRl1+9rSSvNpPMwJNTwos=
== encrypted data (Base64 encoded) ==
on5LIKdw1UxqfcYY


これらのデーターが復号化できることを、PHPのスクリプトでopenssl_open()を使って確認してみる。

$privatekey = file_get_contents("privatekey.pem");
$message= "";
$encrypted = "on5LIKdw1UxqfcYY";

$ekey = "NIBGzm6ijGFjtruyVO4QDBGiWNu1bgJvJPlkY5kmCNLKEuabiBytsjRfOKZb7w4jsSnCrUREeCPHwa7SLMVceNQf6iWyE22RS6tAMVvzFBrKjXwNCZ+pU4v4pCQPTI+vZg7B/QcajR832hmBcG0NF8LRl1+9rSSvNpPMwJNTwos=";

if (!openssl_open(base64_decode($encrypted), $message, base64_decode($ekey), $privatekey)){
echo "Failed decrypt\n";
die;
}
echo $message."\n";
?>


このPHPスクリプトを実行して、"Hello World!"が表示されれば、正しく復号化できたということ。


2010年4月6日火曜日

Python から Cを利用

PythonからCのライブラリを利用するときに、Pythonのリストオブジェクトをどのように利用するか調べてみた。

リストオブジェクトに入っている文字列を表示し、リストオブジェクト内のオブジェクト数を返却するCプログラムを、test2モジュールとして作成してみた。

#include <Python.h>

static PyObject *
test2_listnum(PyObject *self, PyObject *args)
{
PyObject *list;
PyObject *item;
char *itemstr;
int num;
int i;
if (!PyArg_ParseTuple(args, "O", &list)){
return NULL;
}
num = PyList_Size(list);

for (i=0;iitem = PyList_GetItem(list, i);
itemstr = PyString_AsString(item);
printf("%s\n", itemstr);
}

return Py_BuildValue("i", num);
}


これをビルドするためのMakefile。

CC = gcc

.c.o:
$(CC) -fPIC -I"/usr/include/python2.4" -c $<

all: test2

clean:
rm -r *.o; rm -r *.so

test2: test2.o
$(CC) $(OPT) -Wl,-soname,$@.so -shared -o $@.so $^


そして、テスト用のPythonプログラム。

#!/usr/bin/python

import test2

a = []
a.append("test1")
a.append("test2")
num = test2.listnum(a)
print num



2010年4月1日木曜日

Perl CPAN::Siteの仕様変更

ネットワークアプライアンスのInfobloxで提供されるPerl APIを利用するために、マニュアルに従って、Perl CPAN::Siteの最新版(1.05)をインストールした。

ドキュメントに従って、
# perl -MCPAN::Site -e shell
を実行すると、何も起きずにすぐ終了してしまう。
straceをかけてみたが、エラーらしきエラーもなし。

いろいろ調べていくうちに、CPAN::Siteのドキュメントに、1.01から仕様が大幅に変更されたとか書いてある。
もしやと思って、ちょっと古い CPAN::Site 0.26に入れ替えてみたら、ドキュメント通りに動作するようになった。
ありがちな罠だけど、これは一般人には解決できない気がしたので、メモを残しておく。


2010年3月16日火曜日

[Google Apps更新情報] Gmailを複数ユーザーでメールアカウントを共有

GmailのDelegate機能を利用して、秘書がマネージャーのメールを操作するような使い方ができるようになった。

http://googleappsupdates.blogspot.com/2010/03/contact-delegation-available-in-gmail.html

リンク先にある動画を見るとわかりやすい。
顧客対応のメールアドレスなどを、複数人で利用する場合などにも活用できそうかな。


2010年3月11日木曜日

Ubuntu 9.04 の Firefox 3.5 に Flash Player 10をインストール

Ubuntu 9.04のデフォルトのWebブラウザをFirefox 3.5に変更したものの、Flash Playerがインストールされていなかったので、Yahooの天気予報とかが見れずに不便だったので、Flash Player10をインストール

http://get.adobe.com/jp/flashplayer/

ここからdebパッケージをダウンロードしようと思ったけど、どうやらdebはまだ無いようなので、tar.gzファイルをダウンロード。
展開すると、libflashplayer.soができたので、このファイルを ~/.mozilla/plugins/ディレクトリにコピーしてやるとFlashが使えるようになった。


2010年3月6日土曜日

Linuxのスケルトンファイルをコピー

cpコマンドで/etc/skelなどのスケルトンファイルを一括コピーしたいときのコマンド。


# cp -r /etc/skel/. /home/takeda


1年前も悩んだので、忘れたときのために記録。
正規表現とかでやろうとするとはまる。

2010年2月23日火曜日

1つのApacheに複数のDjangoアプリ

Djangoで、1つのApacheに複数のDjangoアプリを載せたいときは、
PythonInterpreterの設定をしておかないと、動作が異常になる。

http://djangoproject.jp/doc/ja/1.0/howto/deployment/modpython.html

アプリAにアクセスしたのに、アプリBのエラーが出力されてびっくり。

2010年2月21日日曜日

[python-ldap] 64bit環境でpage resultコントロールを利用するとエラー

CentOS5のpython-ldapを使って、LDAPの検索をするときにpage resultコントロールを利用するとエラーになる。

http://www.mail-archive.com/python-ldap-dev@lists.sourceforge.net/msg00458.html

RedHatにバグ登録もされているけど、修正版はまだ無いらしい。
https://bugzilla.redhat.com/show_bug.cgi?id=490343

パッチはそんなに難しくなかった。
RHEL5のpython-ldapは、LDIFの扱いの問題とこの問題の2つの問題に遭遇したので、アップデート必須。

SambaのTDBファイルの削除の可否

SambaのTDBファイルには、永続的に利用するファイルと、一時的なキャッシュのファイルがある。
TDBファイルをクリーンアップしてよいかどうかは、ソースのstate_path()、lock_path()、cache_path()のどの関数でディレクトリ名を取得しているかで判別できる。

state_path()でdb_open()しているTDBファイルは削除してはダメ。

http://lists.samba.org/archive/samba-technical/2004-December/038250.html


2010年2月19日金曜日

Windows Server 2008 + クラスタサービスだとsmbmountで接続できない

こんな問題があるなんて、普通の人は気づかないと思う...。
しかもクラスタソフト導入の時だけとか...。

http://support.microsoft.com/kb/975512/ja



2010年2月17日水曜日

[Python] Active Directoryにグループを登録

備忘録。


#!/usr/bin/python

import ldap, ldap.modlist

ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
ldap.set_option(ldap.OPT_REFERRALS, 0)
conn = ldap.initialize("ldaps://adserver.example.com")
conn.bind_s("Administrator@example.com","password")

groupname="testg1"
desc="test description"
groupdn = "CN=%s,CN=Users,DC=EXAMPLE,DC=COM" % groupname
attrs = {}
attrs['objectClass'] = ['top','group']
attrs['sAMAccountName'] = groupname
attrs['cn'] = groupname
attrs['description'] = "testgroup"

ldif = ldap.modlist.addModlist(attrs)
conn.add_s(groupdn, ldif)


2010年2月9日火曜日

[Google Apps更新情報] Message Securityでメールログの検索機能に対応

http://googleappsupdates.blogspot.com/2010/02/message-security-for-google-apps.html

Google AppsのPostiniを利用して、メールログの検索ができるようになったらしい。
どこからメールが来たとか、どこへメールを送信したかとかが確認できるようになった模様。


[Python] IPアドレスを32bit整数に変換

こんな感じかな。

import socket, struct
def main():
ip = "192.168.0.1"
print struct.unpack('I', socket.inet_aton(ip))[0]
return

main()



2010年1月30日土曜日

OSSの認証基盤に関する調査報告 2007年版

OSS によって構築可能な認証基盤構成技術の現 状と事例調査

ちょっと古いので最新の技術情報は含まれないけど、概要としては十分。
http://www.ipa.go.jp/software/open/ossc/download/PKI_Research.pdf



2010年1月29日金曜日

ロゴがORACLEに

Sunのサイトのドキュメントを見に行ったら、ロゴがORACLEになっていて焦った。

http://docs.sun.com/

2010年1月26日火曜日

ccccでソースコードの行数をカウント

Cのソースコードの行数をカウントするのに、ccccを使ってみた。
http://sourceforge.net/projects/cccc/

Ubuntu 9.04(x64)でccccを使うと、次のエラーで終了してしまった。

terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::substr
Aborted


仕方ないので、CentOS5(i386)で試してみたところ、問題なく動作した。
もしかしてccccって64bit対応していない??


2010年1月23日土曜日

CentOS5でNISクライアントの設定

10年ぶりぐらいにNISクライアントの設定を行ったけど、微妙に昔と違うので、覚書。

1. domainnameの設定
/etc/sysconfig/networkにNISDOMAINとして、domainnameを設定

...
NISDOMAIN=example


2. /etc/yp.confの設定
yp.confの最後に、NISサーバーを指定するために、次の設定を追加

domain example server server1.example.com


3. ypbindを起動

# /sbin/service ypbind start
# /sbin/chkconfig ypbind on


4. /etc/nsswitch.confにnisのエントリを追加

passwd: files nis
shadow: files nis
group: files nis



2010年1月22日金曜日

LDAPエントリ内の時刻表記

OpenLDAPのエントリに時刻を格納したい場合、「Generalized Time syntax」と呼ばれる書式で、時刻情報を格納することができる。
Generalized Time syntaxはRFC4517の「3.3.13 Generalized Time」で定義されている。
http://www.ietf.org/rfc/rfc4517.txt

Generalized Time syntaxの利用例としては、エントリの更新時刻を表すmodifyTimestamp属性だが、その時刻情報の最後には、「Z」が付いている。

modifyTimestamp: 20100121093114Z


このZは、GMTを表しているので、JSTで動作しているサーバーの時刻とは9時間ずれることに注意が必要。



2010年1月9日土曜日

inotify-toolsとpyinotify

Linuxで、あるディレクトリ内にファイルが作成されたり、削除されたりといったイベントを検知したい場合、inotifyと呼ばれる仕組みが利用できる。

inotifyを簡単に利用するためのツールとして、Fedora12にはinotify-toolsパッケージがあるので、CentOS5用に再ビルドして利用することが可能。
使い方はこのサイトがわかりやすそう。
http://www.usupi.org/sysad/157.html

Python経由でinotifyをハンドリングしたい場合は、pyinotifyを利用すると良さそう。
http://pyinotify.sourceforge.net/


2010年1月6日水曜日

Mac OS X 10.4(Tiger)でWindows2003R2にCIFS接続

いまさらながら、Mac OS X 10.4 (Tiger)のCIFS接続機能で、Windows 2003 R2のファイル共有に接続する必要が生じたので、接続を試してみたところ、「パスワードが一致しない」エラーになって繋がらない....。

Mac OS Xはほとんど使ったことないので、いろいろ調べたところ、Mac OS X 10.4では、Windows Server 2003 に接続するときに、ドメインセキュリティポリシーを変更する必要があるという情報を発見。
http://allinthehead.com/retro/218/accessing-a-windows-2003-share-from-os-x

Windows Server 2003の「管理ツール」-「ドメインコントローラーセキュリティーポリシー」-「セキュリティの設定」-「ローカルセキュリティ」-「Microsoft ネットワークサーバー:常に通信にデジタル署名を行う」を無効に設定することで、接続できるようになった。

最初、「ドメインメンバ: 常にセキュリティで保護されたチャネルのデーターをデジタル的に暗号、または復号化を行う」を無効にして、繋がらずに悩んだ...。 文言が似ていて、有効になっていたので、最初に目に入ってきて勘違いした。