SSHのクライアント認証

持ち歩くFreeBSDクライアントの方は一応DHCPと固定IPの複合で使えるようにしたので、他のPCからもSSHログインできるようにします。

この場合、接続場所によってサブネットが変わるのでIPフィルタでは大変です。それでクライアント認証を使い、ログインできる端末を制限します。

[Windowsで鍵生成]
Windows側で鍵を作成する場合はTeraTermを利用します。
ターミナル:Tera Term Professional Version 4.48 with Japanese resource
SSHクライアント:TTSSH ( Tera Term同梱)

日本語化バージョンで説明します。
(デスクトップが日本語・ノートが英語バージョン使っている変わり者です)

メニューの[設定]-[SSHキー作成]をクリックします。
キーの種類を選択し(今回はDSA)[生成]ボタンをクリックします。
しばらく待つと秘密鍵パスワードの設定が可能になりますので、パスワードを入れて[公開鍵の保存]と[秘密鍵の保存]でそれぞれ保存します。ここで作成された公開鍵をサーバに送ります。

[UNIX系で鍵生成]
# ssh-keygen -b 1024 -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_dsa):
保存場所を聞かれますがデフォルトでよければそのままEnter

Enter passphrase (empty for no passphrase):
秘密鍵パスワードを聞かれたらパスワードを入力。
これで秘密鍵(id_dsa)、公開鍵(id_dsa.pub)が生成されます。

[UNIXサーバ側の設定]
ログインするユーザのホームディレクトリの下に認証用の公開鍵をまとめるファイルを生成します。
最初のキーの場合はcpでも良いのですが、下記コマンドであれば新規・追加両方使えます。

> cat public_keyfile >> ~/.ssh/authorized_keys
通常公開鍵はid_dsa.pubなので

> cat id_dsa.pub >> ~/.ssh/authorized_keys
authorized_keysは複数の公開鍵を追加できるので、同じユーザ利用で他のクライアント用に別の秘密鍵を用いて認証することが可能です。

1枚のLANカードに複数のIPを振ってみた

httpsの通信ではネームベースのバーチャルホストでは鍵の識別ができなくなるので、複数IPを振ってみることにしました。その他の利用法としてLAN内のみで開発する場合に複数のサブネットを作成することでLAN用サブネットではウェブアクセス、エイリアスの新サブネットではDB接続等の構成が可能になります。

ではやり方。
# ee /etc/rc.conf (一部抜粋)
ifconfig_fxp0=”inet xxx.yyy.zzz.11 netmask 255.255.255.248″
ifconfig_fxp0_alias0=”inet xxx.yyy.zzz.12 netmask 255.255.255.255″

rc.confにこのように設定します。
netmaskが255.255.255.255なのは同じカードで同じネットマスクの場合に、同じサブネットですよ~という意味らしい。これを255.255.255.248のように設定すると同じIP帯のサブネットを別途生成することになり後々わかわからない傷害に悩まされる可能性がある。

次に、増設したLAN側(CardBus)の設定も多重化します。こちらはIPだけでなくサブネットも多重化してみます。

# ee /etc/devd/rl0.conf (一部抜粋)

device-name “rl0”;
action “ifconfig $device-name inet 192.168.0.11 netmask 255.255.255.0”;
action “ifconfig $device-name inet 192.168.0.12 netmask 255.255.255.255 alias”;
action “ifconfig $device-name inet 192.168.3.11 netmask 255.255.255.0 alias”;
action “ifconfig $device-name inet 192.168.3.12 netmask 255.255.255.255 alias”;
action “route add default 192.168.0.1”;
action “route add default 192.168.3.1”;

追加サブネットについては2台とも設定してお互いに通信できるようにしました。(念のため片方だけ設定したときに、もう片方からpingが通らないことを確認)

あとは新規に追加したグローバルIPの方はファイヤーウォールの穴あけないと接続できない。(出来た方が問題なのでこれ良い)。ウェブとメールだけは空ける必要があるので後で空けておこう。

多彩なバーチャルホスト

この前、SUEXEC対応でインストールしたので、各バーチャルホストで別々のユーザ設定。SSLのバーチャルホストをやってみたいと思います。

./configure –prefix=/usr/local/apache
–enable-module=so
–enable-ssl
–enable-suexec
–with-suexec-docroot=/home
–with-suexec-uidmin=1000
–with-suexec-gidmin=1000

実はwith-suexec-docrootでやっぱり後悔して/homeで再インストしました。

VirtualHostディレクティブの中で
SuexecUserGroup uid gid
を設定するとSUEXECが有効になります。このときに気をつけるのは、Apacheをインストールした後にAppacheのUserとGroupは変更しないこと。SuexecUserGroupで指定するuidとgid(idじゃなく名称でも良い)は–with-suexec-uidminと–with-suexec-gidminの値を超えていること。そして実際にCGI等を配置するディレクトリは–with-suexec-docrootで指定したディレクトリ内にあることです。

次に、IPベースとネームベースの両方を用いたバーチャルホスト設定をしてみました。
※但し現在はグローバルを1個だけしか振ってないのでポートで分けた。

NameVirtualHost *:80
NameVirtualHost *:8080
ServerName vhost1.exsample.com:80
ServerAlias vhost1.exsample.com:80
ServerName vhost2.exsample.com:80
ServerAlias vhost2.exsample.com:80
ServerName vhost3.exsample.com:8080
ServerAlias vhost3.exsample.com:8080
ServerName vhost4.exsample.com:8080
ServerAlias vhost4.exsample.com:8080

ざっとこんな感じSSL側もNameVirtualHostを入れることによってサブドメイン毎に表示を分けることができましたがサーバ認証はどうしても最初のディレクティブで設定したものが使用されてしまう。SSL側だけはIPベースのバーチャルホストにしないと問題がでそうだ。

バーチャルホストについても本当のIPベースとネームベースの複合もやりたいので、追加を行ってみます。