Hatena::Groupfreebsd

FreeBSD 行き当たりばったり記

2013-07-27セキュアなファイル共有を構築する。

というかstunnel面白すぎ。 01:02

ここ

ここの合わせ技+アルファだけど、

サーバのstunnel.conf抜粋

[ssmb]
accept  = 0.0.0.0:任意の待受ポート
connect = localhost:445

smb.conf抜粋

   [global]
   hosts allow = 127.
   hosts deny = ALL
   smb ports = 445
   interfaces = 127.0.0.1
   bind interfaces only = Yes

クライアント(windows

コントロールパネルからハードウェアの追加と削除かなんだか、

検索がタイムアウトしたら、「ハードウェアは既に接続しています」とかなんとか。

「新規にハードウェアを追加する」というような選択。

検索するのでなく「拡張」からハードウェアを選択。

「ネットワークアダプタ」を選択し、「microsoft network adapter」を選択。

出来上がったインターフェースに未来永劫自分のネットワークで使用しないアドレスを設定。

winsタブでnetBIOSoverTCP/IPを使用しないに設定。

windows用のstunnelをインストールし、

stunnel.confでacceptを上記のインターフェースのポートtcp/139に

connetcをサーバのアドレス:待受ポートに設定。

(サーバでnmbd bind explicit broadcast = Yes とするとうまく行かない

&クライアントでも何らかのインターフェースでnbtが有効じゃないとport139にうまく接続できない。

今後の研究課題なり)

とりあえずtcpdumpしてもnetbios,smb,cifsのパケットは全然出なくなった。

これなら万一ネットワークに侵入されてもmd5やntlmのパスワードを窃取される心配も軽減するし、

そもそもファイル共有しているかどうかも不明になるんじゃないでしょうか?

いやぁ、stunnel恐るべし。

2013-06-10ssh over ssl を試してみた

外部から自宅に接続したい時って結構ある 14:41

しかし勉強会の会場とかその他仕事関係とかだと

透過プロキシなどに阻まれてtcp 80 と 443 しか

出て行けないなどと泣きを見たりする。

そこで「stunnel」を使って表題の通信を実現しよう

という企みなのです。

ports からインストール(ついでに鍵と証明書も作成)

[root@server]security/stunnel# make install cert
-----------中略------------------------
===>   Registering installation for stunnel-4.56
-----------中略------------------------
**************************************************************************
The new certificate will be saved into /usr/local/etc/stunnel/stunnel.pem
**************************************************************************

if test ! -r /usr/local/etc/stunnel/stunnel.pem; then  if test -r "/dev/urandom";
 then  dd if="/dev/urandom" of=stunnel.rnd bs=256 count=1;  RND="-rand stunnel.rnd";
  else  RND="";  fi;  /usr/bin/openssl req -new -x509 -days 365 $RND  -config
 ./stunnel.cnf  -out stunnel.pem -keyout stunnel.pem;  /usr/bin/openssl gendh $RND 1024 >> stunnel.pem;
  /usr/bin/openssl x509 -subject -dates -fingerprint -noout -in stunnel.pem;
  /usr/bin/install -c -o root -g wheel -m 600 stunnel.pem /usr/local/etc/stunnel/stunnel.pem;  rm stunnel.pem;  fi
1+0 records in
1+0 records out
256 bytes transferred in 0.000170 secs (1505949 bytes/sec)
Generating a 2048 bit RSA private key
-----------中略------------------------
writing new private key to 'stunnel.pem'
-----
You are about to be asked to enter information that will be incorporated
-----------中略------------------------
-----
Country Name (2 letter code) [PL]:JP
State or Province Name (full name) [Mazovia Province]:Tokyo
Locality Name (eg, city) [Warsaw]:Chiyoda
Organization Name (eg, company) [Stunnel Developers]:MLIT 
Organizational Unit Name (eg, section) [Provisional CA]:HQ
Common Name (FQDN of your server) [localhost]:
256 semi-random bytes loaded
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.........................................................+.....
---------------中略----------------------------------------------
.............................++*++*++*
subject= /C=JP/ST=Tokyo/L=Nerima/O=Hyam/OU=HQ/CN=localhost
notBefore=Jun  9 08:39:56 2013 GMT
notAfter=Jun  9 08:39:56 2014 GMT
SHA1 Fingerprint=68:36:43-----------------------------------------------B:16
/usr/bin/install -c -o root -g wheel -d -m 1770 /var/tmp/lib/stunnel
chgrp nogroup /var/tmp/lib/stunnel

上記をサーバクライアント双方で実施します。

(今回の目的ではクライアントに証明書は不要ですけど)

で、

[root@server]security/stunnel# cd /usr/local/etc/stunnel
[root@server]etc/stunnel# cp stunnel.conf-sample stunnel.conf
[root@server]etc/stunnel# vi stunnel.conf
chroot = /var/tmp/stunnel

上記をインストール時に作成された

/var/tmp/lib/stunnel に変更

; Chroot jail can be escaped if setuid option is not used
setuid = stunnel
setgid = nogroup

; PID is created inside the chroot jail
pid = /stunnel.pid

上記はそのまま。

debug = 7
output = /stunnel.log

コメントアウト消して、path を/ にする(chroot 先の / になる)

cert = /usr/local/etc/stunnel/stunnel.pem

上記はさっきインストールしたファイル名に変更。

;[pop3s]
;accept  = 995
;connect = 110
 
;[imaps]
;accept  = 993
;connect = 143

;[ssmtp]
;accept  = 465
;connect = 25

↑この辺は使っていないならコメントアウトする。

で、下記が肝心の部分。

・サーバ

[sshOssl]
accept  = 443
connect = 22

・クライアント

[ssh2ssl]
client  = yes
accept  = 12222
connect = server.address.here:443

取り合えずサーバーをテスト。

[root@server]etc/stunnel# openssl s_client -connect localhost:443
CONNECTED(00000003)
depth=0 /C=JP/ST=Tokyo/L=略
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=JP/ST=Tokyo/L=略
verify return:1
---
Certificate chain
 0 s:/C=JP/ST=Tokyo/L=略
   i:/C=JP/ST=Tokyo/L=略
---
Server certificate
-----BEGIN CERTIFICATE-----
-----------中略------------------
-----END CERTIFICATE-----
subject=/C=JP/ST=Tokyo/L=略
issuer=/C=JP/ST=Tokyo/L=略
---
No client certificate CA names sent
---
SSL handshake has read 1625 bytes and written 336 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    -------中略------------------
    Verify return code: 18 (self signed certificate)
---
SSH-2.0-OpenSSH_5.4p1_hpn13v11 FreeBSD-20100308

Protocol mismatch.
closed

あれ?

最後のprotocol mismatch は相手がssh だから

当然なので問題ないとして、

Verify return code: 18 (self signed certificate)

「俺ヲレサーバはだめ」って言う事かな?分からん?

こうしてみる。

[root@server]etc/stunnel# openssl s_client -CAfile stunnel.pem -connect localhost:443
CONNECTED(00000003)
-----------中略------------------
SSL-Session:
    -------中略------------------
    Verify return code: 0 (ok)
---
SSH-2.0-OpenSSH_5.4p1_hpn13v11 FreeBSD-20100308

Protocol mismatch.
closed

OKっだそうです。

そういうわけで当初はサーバのstunnel.pemをコピってきて

クライアントのchrootに置いて、stunnel.conf で

CAfile = /stunnel.pem とし、ファイル指定していたんだけど、

結果的にはしてもしなくてもどちらでも通信できる。

無駄な事をしてしまった。

・・・

あと、以下のコマンドも入れておく。

[root@server]etc/stunnel# touch /var/tmp/lib/stunnel/stunnel.log
[root@server]etc/stunnel# chown stunnel:stunnel /var/tmp/lib/stunnel/stunnel.log

さらに、現状だと

[root@server]etc/stunnel# service stunnel stop
stunnel not running? (check /var/run/stunnel.pid).

となってしまうが、/etc/rc.d/stunnel の記載では、

# stunnel_pidfile (str): Default "/usr/local/var/stunnel/stunnel.pid"

# Set it to the value of 'pid' in

# the stunnel.conf file.

こんな風に、設定ファイルに書けばOKみたいな事になっている。

良く分からん。

・・

しかたがないので強引に

: ${stunnel_pidfile="/var/run/${name}.pid"}

の部分を

: ${stunnel_pidfile="/var/tmp/lib/stunnel/${name}.pid"}

と変更して、stop 出来るようにした。

ここまでやったら、あとはサーバの/etc/rc.confyes 入れるなり、

クライアントはonestart 使うなりで、双方でstunnelを起動。

さて、と、

[user@client]~> ssh -p 12222 localhost
ssh_exchange_identification: read: Connection reset by peer

ありゃ、またダメか? 14:41

tcpdumpで確認するとクライアントからパケットは出ているのに

サーバーに届いていない。

バカです。

途中のファイアウォールに443許可の設定入ってませんでした。

設定して再度挑戦。

[user@client]~> ssh -p 12222 localhost
ssh_exchange_identification: read: Connection reset by peer

まだ駄目なり。

サーバ上で今度は対象ポートを22にしてtcpdumpすると判明しました。

/etc/ssh/sshd_config の中の、ListenAddressがインターフェース

のアドレスになっている。(まあこれはjailを飼っているので、当然

ホスト側ではホストのアドレスのみでlistenするために変更したのです)

気を取り直し、ListenAddress localhost の一行を加えてsshdをリブート。

[user@client]~> ssh -p 12222 localhost
Last login: Sun Jun  9 17:17:34 2013 from 172.16.xx.yyy
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
        The Regents of the University of California.  All rights reserved.

FreeBSD x.x-RELEASE (GENERIC) #0: Wed Jul 11 04:52:04 JST 2012
If you'd like to keep track of applications in the FreeBSD ports tree, take a
look at FreshPorts;

        http://www.freshports.org/
[user@server]~>

一件落着。