NTEmacs: fiber.exe2007/02/27 09:49

Mac OS X には open という便利なコマンドがあって、ターミナル(Terminal.app)にいるときに open コマンドに適当なファイル名を与えると、そのファイルに関連付けられているアプリケーションを起動してファイルを開いてくれる。

とくに Emacs でメールを読んでいるときにはこの open コマンドがすごく役に立つんだけれど、Windows には open に相当するコマンドがない。

で、Meadow には open と同じことをしてくれる fiber.exe という実行ファイルが添付されている。

NTEMacs には添付されていない。ということで、NTEmacs を使う場合には、fiber.exe でググって、適当なパスに入れてやる。まぁ、コマンドの性格上、cygwin\bin あたりが適当かな...

NTEmacs 化計画2007/02/27 09:00

会社から貸与されている業務用 Windows 機を Dell から Lenovo に変えたので、環境の構築をしている。

Emacs 22 を使いたいので、Meadow ではなく NTEmacs にするが... NTEmacs。情報がものすごく少ない。

まぁそれでも世の中には親切な方もいるもので、下記 URL から IME パッチのあたった NTEmacs のバイナリが入手できる。

http://homepage.mac.com/matsuan_tamachan/emacs/NtemacsBinaries.html

さて。

NTEmacs 導入の最終目標は、次のとおりである。

・Mew + mew-w3m で快適なメール生活。

はてさて。どうなることやら。

AIX: ログイン名の変更2007/02/23 15:00

AIX ではユーザーの属性を変更するために chuser コマンドが用意されている。

が、chuser コマンドでは、ログイン名を変えることができない。

どうするか?

usermod コマンドを使う。オプションは -l。これは Solaris や Linux と同じ。

てもとの AIX 5.3 には /usr/sbin/usermod が存在する。一般的なのだろうか? ちなみに、mkuser / rmuser /chuser ともに man ページが存在するが、なぜか usermod だけは man ページがない。

AIX: パスワード管理2007/02/14 14:39

備忘録。

プログラムで AIX にユーザー・アカウントを作成すると、そのユーザーが最初にログインするときにパスワードを再設定するように求められる。

この動作がたいへんうっとうしいので、初回ログイン時にもパスワードの再設定を求められないように変更するにはどうするか...

/etc/security/passwd ファイルに、該当ユーザーのパスワードの振る舞いに関する設定がある。たとえばこんなふう。

sshdup03:
        lastupdate = 1171371839
        flags = ADMCHG

flags = ADMCHG の行を削除すると、パスワードの再設定を求めなくなる。

ただ、vi などでファイルを開いて直接エントリを削除するのはご法度だそうだ。pwdadm というコマンドから、このあたりの動作を確認、変更することができる。

# pwdadm -q sshdup03
sshdup03:
        lastupdate = 1171371839
        flags = ADMCHG

#pwdadm -c sshdup03

# pwdadm -q sshdup03
sshdup03:
        lastupdate = 1171371839

-q オプションで情報の表示、-c オプションで flags のクリア、である。

AIX: 備忘録2007/02/14 11:10

なぜこうなったかわからない。が、TeraTerm Pro でログインしていると、こんな文字列が...

# ^ァ^」^チ^マ^」^チ^ラ^」^チ^^」^チ^ル^」^タ^

これ、どうやったら入力できるんだろう...

AIX: ユーザーの作成2007/02/14 10:48

備忘録。いや、書いておかないと忘れるもんで... AIX でユーザーを作る方法。smitty。というのはおいておいて。 mkuser コマンドが使える。 ユーザーを削除するなら、rmuser。

AIX: サービスの起動2007/02/14 10:37

ひきつづき AIX 5.3 であそんでいる。

SunOS 4.1.3 -> Solaris 2.x -> Debian Gnu/Linux と、ある意味UNIX としてメジャーな街道を歩いてきた身には、「これも UNIX?」と思うことが多い。

/etc/init.d や /etc/rc?.d がないので、はて、どこからサービスを起動したものかしらん?、と悩んでいたら、AIX は SRC (System Resource Controller)というのを使うんだそうな。

# startsrc -s sshd
# stopsrc -s sshd

のようにすると、sshd の起動と停止が行える。

で、この startsrc / stopsrc がどの設定ファイルを読んでいるのかというと、どうも /var/adm/SRC/active_list であるそうな。sshd のエントリは下記のようになっている。

sshd _
-D
/usr/sbin/sshd 0 0 /dev/console /dev/console /dev/console 1 0 2 0 0 20 15 9 1 20 ssh

/dev/console のあとの数字はなにゃらよくわからないけれど、ふーん。勉強になるなぁ。

AIX: ユーザー名の長さ2007/02/13 18:50

ちょっと用事があって SSH on AIX で遊んでいる。ま、SSH 経由で AIX にユーザーアカウントを作りたいのだけれど、やっててはまったことに、AIX 5.2 ではユーザー名の長さはどうあがいても最大8文字まで。AIX 5.3 はデフォルトで 8文字まで。8文字以上255文字まで使いたい場合は設定を変更しなければならないということ。いきなり長いユーザー名を流し込んで「ユーザー名が長すぎます」と怒られてびびった。

で、どうせこのあたりの設定は /etc/security あたりにあるんだろう、と思って探し回ったが、ない。

しょうがないのでネットでいろいろ調べると、コマンドで操作するんですなぁ...

# lsattr -El sys0 -a max_logname
max_logname 9 Maximum login name length at boot time True

lsattr というコマンドを使うらしい。上記例では、9文字がユーザー名の最大長になっている。

ちなみに変更するには chdev というコマンドを使うらしいのだが、遊んでいるのは借り物の環境なので、今回は試してない。

# chdev -l sys0 -a max_logname=21

しかし、設定するのと確認するのと、違うコマンドを使わなきゃならんなんて、なんていう設計するんだろう...

AIX のユーザー名に関する制限などは、このへんを参考にした。

コメント・スパムの切りかた?2007/02/11 21:46

先般来,コメントにスパムの書き込みがある。みつけたら削除しているけれど,これ,asablo の設定でなんとかならないものか...

公開鍵の秘密 -追補- 32007/02/09 15:32

次に ssh-keygen が実際に秘密鍵を作成する部分のコードを見てみる。
ssh-keygen.c をたどっていくと、

   1338         private = key_generate(type, bits);
   1339         if (private == NULL) {
   1340                 fprintf(stderr, "key_generate failed");
   1341                 exit(1);
   1342         }

となっている。private は Key 型へのポインタである。key_generate() は key.c で定義されている。

    594 Key *
    595 key_generate(int type, u_int bits)
    596 {
    597         Key *k = key_new(KEY_UNSPEC);
    598         switch (type) {
    599         case KEY_DSA:
    600                 k->dsa = dsa_generate_private_key(bits);
    601                 break;
    602         case KEY_RSA:
    603         case KEY_RSA1:
    604                 k->rsa = rsa_generate_private_key(bits);
    605                 break;
    606         default:
    607                 fatal("key_generate: unknown type %d", type);
    608         }
    609         k->type = type;
    610         return k;
    611 }

key_generate() はとても短い。key->type が KEY_RSA のときには、rsa_generate_private_key() を呼び出す。この関数は key.c で定義されている。

    569 static RSA *
    570 rsa_generate_private_key(u_int bits)
    571 {
    572         RSA *private;
    573
    574         private = RSA_generate_key(bits, 35, NULL, NULL);
    575         if (private == NULL)
    576                 fatal("rsa_generate_private_key: key generation failed.");
    577         return private;
    578 }

鍵が RSA 形式の時には、rsa_generate_private_key() の中で RSA_generate_key() を呼んでいる。紛らわしいが、大文字で始まるほうの RSA_generate_key() は、openssl のソースに含まれているので、これ以上 OpenSSH のソースコードを漁っても何も得られない。

openssl-0.9.8d を展開したあと、crypto ディレクトリに移動するとそこに rsa_depr.c というソースコードがある。RSA_generate_key() はそこに定義されている。

     71 RSA *RSA_generate_key(int bits, unsigned long e_value,
     72              void (*callback)(int,int,void *), void *cb_arg)
     73         {
...中略
     92         if(RSA_generate_key_ex(rsa, bits, e, &cb)) {
     93                 BN_free(e);
     94                 return rsa;
     95         }

とまぁ、RSA_generate_key() のなかでは今度は RSA_generate_key_ex() を呼び出している。_ex つきの関数は rsa_gen.c の定義されている。これで何度目のリダイレクトだ?

rsa_gen.c では、

    78 int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb)
     79         {
     80         if(rsa->meth->rsa_keygen)
     81                 return rsa->meth->rsa_keygen(rsa, bits, e_value, cb);
     82         return rsa_builtin_keygen(rsa, bits, e_value, cb);
     83         }

RSA_generate_key_ex() の関数は、これがすべてである。

本当の鍵の生成は rsa_builtin_keygen() を呼び出しておこなっており、rsa_builtin_keygen() は RSA_generate_key() の直後から定義されている。この関数は長いので割愛。

さて、話を元に戻すと、key_generate() の結果を private (Key 型へのポインタ)に保存すると、その先の処理は大きく分けて二つある。一つは private から公開鍵を生成すること、そしてもうひとつは private を秘密鍵として保存することである。

もう一度 key_generate() の部分を ssh-keygen.c から抜き出すと下記のとおりで、これは今回の冒頭に挙げているものと同じだ。

   1338         private = key_generate(type, bits);
   1339         if (private == NULL) {
   1340                 fprintf(stderr, "key_generate failed");
   1341                 exit(1);
   1342         }

private = key_generate(type, bits); の処理で、private には RSA の鍵情報が入っている。この直後に、

   1343         public  = key_from_private(private);

として、private の内容から公開鍵の情報を取り出して、やはり Key 型へのポインタである public へ代入している。

そして、最終的に、

   1405         if (!key_save_private(private, identity_file, passphrase1, comment)) {
   1406                 printf("Saving the key failed: %s.\n", identity_file);
   1407                 memset(passphrase1, 0, strlen(passphrase1));
   1408                 xfree(passphrase1);
   1409                 exit(1);
   1410         }

と、key_save_private() で identity_file に設定されているファイルへ書き出すのである。

最後に見るのは、key_save_private() だ。この関数は OpenSSH の authfile.c で定義されている。

    204         switch (key->type) {
    205         case KEY_DSA:
    206                 success = PEM_write_DSAPrivateKey(fp, key->dsa,
    207                     cipher, passphrase, len, NULL, NULL);
    208                 break;
    209         case KEY_RSA:
    210                 success = PEM_write_RSAPrivateKey(fp, key->rsa,
    211                     cipher, passphrase, len, NULL, NULL);
    212                 break;
    213         }

と、key->type が KEY_RSA なら PEM_write_RSAPrivateKey() を呼び出す。この PEM_write_RSAPrivateKey() はマクロで、openssl-0.9.8d/crypto/pem/pem.h に次のように定義されている。

    409 #define PEM_write_RSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \
    410                 PEM_ASN1_write((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,fp,\
    411                         (char *)x,enc,kstr,klen,cb,u)

つまり、PEM_ASN1_write である、と。

openssl-0.8.9d/crypto/pem/pem_lib.c に実際の PEM_ASN1_write() が定義されている。

結果から言うと、PEM_ASN1_write() からは更に PEM_ASN1_write_bio() を呼び出しており、正真正銘、これが最終最後の場所なのだが、はっきりいって、中身をみても良くわからん... 結局、ssh-keygen で id_rsa を生成するときに、p、q、d、n、e の情報を格納していると確信できる部分までだ取り付けていない。今後の宿題かなぁ...

暗号関連、嫌いです。