PC設定備忘録

出典: Wikimura

目次

Cygwin

別ドライブにCygwinをインストールする

Cygwinはたくさんのファイルをインストールするし、ごちゃごちゃしている。インストールは別ドライブorどこかのサブディレクトリに置く。

ルートディレクトリは別ドライブでも、ホームディレクトリはマウントによりドキュメントのドライブに置くと便利。

これについての資料は...Cygwin for Professionalを参照。

SSHサーバインストール時にアクセス権のトラブル...すっかり忘れていた...


SSH

サーバインストール

研究室のPCでSVNサーバを稼働させ、リポジトリをファイルサーバに置くことに成功した次のステップとして、他のメンバと共有を考えている。 ただ、Basic認証では、こちらが設定したパスワードを教えまわることになる。利用する側は自分で設定できないし、配る側もいちいち面倒。どうせなら鍵を使った認証を導入したい。 そこで、svnserveをSSHトンネリングモードで動作させ、SSH認証を利用することを考えた。

SSHDをCygwinに入れて、それをサービスとして動かすための方法が紹介されていた。これをそのままやった。詳しいことはさっぱり...

アクセス権の設定不備を指摘された...たしかこうしたら次へ進めた。

/etc/passwd 554
/etc/group  554 
/var        111

特権分離に失敗

ssh-host-configで「特権分離(privilege separation)する」をyesにすると、ローカルアカウント「sshd」を作ろうとするらしい。なぜかそれがうまくいかない。

自分でsshdを作ってみた。コマンドプロンプトから以下のコマンドを実行した。 「net userコマンドの使い方」を参照した。

net user /add sshd

でユーザの作成はできた。これをCygwinへ反映するためにmakepasswdを実行した。 「Cygwin設定メモ」を参照した。

mkpasswd -l > /etc/passwd

これでもう一度ssh-host-configを行うと、特権分離で以下のようにメッセージが続いた。

*** Info: Privilege separation is set to yes by default since OpenSSH 3.3.
*** Info: However, this requires a non-privileged account called 'sshd'.
*** Info: For more info on privilege separation read /usr/share/doc/openssh/READ
ME.privsep.
*** Query: Should privilege separation be used? (yes/no) yes
*** Warning: sshd is in /etc/passwd, but the
*** Warning: local machine's SAM does not know about sshd.
*** Warning: Perhaps sshd is a pre-existing domain account.
*** Warning: Continuing, but check if this is ok.

SAMとは、Security Account Managerのことらしい。

少し不安なので、やっぱり特権分離で権限を持っていない問題を解消することにした。 「cygwin 権限」で検索してみたところ、「sshd on cygwin on Vista」に似た事例があった。Vistaは権限の管理が厳しいため起こっているらしい。 試しにコマンドプロンプトからAdministratorでCygwinを起動してみたが...だめだった。

runas /user:Administrator cygwin.bat

出てきたエラーはこれまでと同じ。ユーザを作ることができないと言われた。

*** Warning: Creating the user 'sshd' failed!
*** Warning: Couldn't create user 'sshd'!
*** Warning: Privilege separation set to 'no' again!
*** Warning: Check your /etc/sshd_config file!

ssh-host-configはスクリプトなのでテキストエディタで開ける。 このエラーメッセージを出す条件となっているのが、「csih_create_unprivileged_user」というルーチンが偽を返すためらしい。このルーチンは、/usr/share/csih/cygwin-service-installation-helper.shに記述されていることが分かった。

ssh-host-config -dによりデバッグモードで実行してみた。 問題個所は以下のようになっていた。

+ dos_var_empty='E:\cygwin\var\empty'
+ net user sshd /add '/fullname:sshd privsep' '/homedir:E:\cygwin\var\empty' /active:no
+ '[' no '!=' yes ']'
+ csih_warning 'Creating the user '\''sshd'\'' failed!'

自宅PCでは、Cygwin上でnetコマンドが動くが、研究室PCではcommand not foundと言われてしまう。なぜこうなったかは分からないが、これが原因らしい。PATHがいけない? 試しにCygwinでPATHを見たところ...

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/bin:/usr/bin:$PATH

これでは動きようがない...起動時に処理されていない? 原因は、cygwin.batbash起動前に以下を追加してしまっていたため。

set path=/bin:/usr/bin:$PATH

起動時のスクリプトで、PATHの中身がCygwin用に置換される(\マークを/にしたり、;を:にしたりする)前にPATH追加をしようとしていた。(別ドライブにCygwinをインストールした際に設定を工夫したつもりだったらしい。昔のことだから忘れてしまっていた)

この行を取り除いたところ、無事ユーザsshdの作成に成功。昔の設定ミスが原因とは...

サーバの開始と終了

●サービスインストール
cygrunsrv -I sshd -d "表示名" -p "sshdの場所" -a "オプション"
        オプション:
           -Dは必須らしい(ソース失念)。
           -d はデバッグレベルを指定できる(3個まで)
              /var/log/sshd.logに記録が残る

・実際に使ったコマンド:
cygrunsrv -I sshd -d "SSH Server for SVN" -p /usr/sbin/sshd -a "-D"

●サービス開始
cygrunsrv -S sshd

●サービス停止
cygrunsrv -E sshd

●サービス削除
cygrunsrv -R sshd

SSHクライアント

研究室PCにSSHとSVNサーバを置いて、外部からSSHで操作できるようにしたい。また、他のメンバとの共有ができるか試したい。ただ、自分のPCのユーザとしてログインされてしまうのだろうか?その辺がよくわからない。

SSHクライアントのアカウント作成

資料によればユーザアカウントを用意しないといけないらしい。SVN用に1つあればよいらしい。 ユーザを用意し、このユーザでCygwinを起動してみた。

net user svnuser
net user svnuser *
パスワード入力2回
runas /user:svnuser E:\cygwin\cygwin.bat

新しいコマンドプロンプトが立ち上がり、ユーザ名のフォルダがユーザのホームディレクトリ(/home/user名)に作られた。WindowsでログインしなおしてCygwinを起動しなくても良いことが分かった。/active:noはだめらしい。Windows上でアカウントが非表示になるが、同時にログインもできなくなる。

ログイン確認

SSHサーバをパスワード認証可能にして挑戦。SSHクライアントからログインできた。

  • 接続先: localhost
  • ポート: 22

SSH2用公開鍵認証の導入

今度は公開鍵認証を設定する。クライアントが秘密鍵を持ち、サーバに公開鍵を置いておく。SSHクライアントはSSH2で、サーバはOpenSSH2なので、鍵はSSH2側で作る。 というのも、「SSHの鍵管理」によれば、公開鍵は変換できるが、秘密鍵は変換できないため。

まずSSH2クライアントから動作確認をしたいため、SSH2に付いてくるssh-keygen2.exeを使う。RSAの2048ビットで鍵を作った。このコマンドを実行すると、自動的にC:\Document and Settings\Application Data\SSH\UserKeys\に鍵が作られる。

ssh-keygen2 -t rsa -b 2048

公開鍵の変換はできても、パスワードはかけられないらしい。パスワードが無い場合、authorized_keysに追加することが必須となるらしい。 「SSH2とOpenSSHの相互接続」を参考に設定してみる。

Server responded "No further authentication methods available."

でもうまく動かない...自宅PCで動いている設定と同じにしてみたのに。 デバッグモードでSSHサーバを動作させ、ログを読んでみたところ...

cygrunsrv -I sshd -p /usr/sbin/sshd -a "-D -d"
cygrunsrv -S sshd

自宅PC
debug1: trying public key file /home/ユーザ名/.ssh/authorized_keys
debug1: fd 4 clearing O_NONBLOCK
debug1: matching key found: file /home/ユーザ名/.ssh/authorized_keys, line 2

研究室PC
debug1: trying public key file /home/ユーザ名/.ssh/authorized_keys
debug1: restore_uid: 18/544
Failed publickey for ユーザ名from 127.0.0.1 port 2995 ssh2
debug1: userauth-request for user ユーザ名 service ssh-connection method publickey

公開鍵認証に失敗している?バージョンを確認してみたところ、問題はなさそう...

自宅PC:
・クライアント
SSH Secure Shell 3.2.9 Windows Client
Copyright (c) 1995-2002 SSH Communications Security Corp
SSH is a registered trademark and Secure Shell is a trademark of
SSH Communications Security Corp (www.ssh.com).
All rights reserved.
・サーバ
OpenSSH_5.1p1, OpenSSL 0.9.8i 15 Sep 2008
usage: sshd [-46DdeiqTt] [-b bits] [-C connection_spec] [-f config_file]
            [-g login_grace_time] [-h host_key_file] [-k key_gen_time]
            [-o option] [-p port] [-u len]

研究室PC:
・クライアント
SSH Secure Shell 3.2.9 Windows Client
Copyright (c) 1995-2002 SSH Communications Security Corp
SSH is a registered trademark and Secure Shell is a trademark of
SSH Communications Security Corp (www.ssh.com).
All rights reserved.
・サーバ
OpenSSH_5.1p1, OpenSSL 0.9.8k 25 Mar 2009
usage: sshd [-46DdeiqTt] [-b bits] [-C connection_spec] [-f config_file]
            [-g login_grace_time] [-h host_key_file] [-k key_gen_time]
            [-o option] [-p port] [-u len]

鍵を作ったユーザが違うことに気付く(後になってこれも間違いだと気付く)

もしかしてユーザが違うため?管理者権限を持つユーザで鍵を作ったから、鍵の所有者が違うことになっているとか...試しに作業しているユーザで鍵を作ってアクセスしたところ...

debug1: trying public key file /home/作業ユーザ/.ssh/authorized_keys
debug1: fd 4 clearing O_NONBLOCK
debug3: secure_filename: checking '/home/作業ユーザ/.ssh'
debug3: secure_filename: checking '/home/作業ユーザ'
Authentication refused: bad ownership or modes for directory /home/作業ユーザ

さっきとは違った反応を示した。

所有者かパーミッションが変らしい...試しにls -alをしたところ、所有権が??????になっていた。修正して再実行したところログインができた。

debug1: trying public key file /home/作業ユーザ/.ssh/authorized_keys
debug1: fd 4 clearing O_NONBLOCK
debug3: secure_filename: checking '/home/作業ユーザ/.ssh'
debug3: secure_filename: checking '/home/作業ユーザ'
debug3: secure_filename: terminating check at '/home/作業ユーザ'
debug1: matching key found: file /home/作業ユーザ/.ssh/authorized_keys, line 1

ということで、鍵の作成者はログインユーザでなくてはならないという基本的なことを無視していたことが原因と分かった。所有権とか本当に混乱してしまう。

作業は1つのユーザだけでやりたいので、runasで別ユーザ実行をしてみた。 (なぜか runasでcygwinを起動すると、ssh-keygen2command not foundになる)

runas /user:ユーザ名 "ssh-keygen2 -t rsa -b 2048 \"C:\Documents and Settings\ユーザ名\Application Data\SSH\UserKeys\鍵名""

秘密鍵: 鍵名
公開鍵: 鍵名.pub

ssh-keygen2標準の保存先にする場合はパスを入れなくてはならない?

疑問

鍵の対はクライアント側で作る。公開鍵はサーバ側へ送る。鍵の作者は必ずしもサーバのログイン名と同じになるわけではない。実際、自宅PCで作った鍵の対を研究室PC内のサーバ・クライアントにそれぞれ与えたところ、自身への接続ができた。

しかし、サーバ側のログインユーザを変えるとうまくいかなくなる。全く同じ鍵を使っていてもだめ。アクセス権の問題で鍵が開けないためなのだろうか?

→何気なくmkpasswd -lをやりなおしてみた後、(他に何を操作したかは覚えていないが)いつの間にか動くようになった...再現性の確認をしないと。本当にどこでミスしたのだろう。

まとめ(まだ間違いに気付いていなかった)

  • ログインするアカウント名義で鍵を作る
  • SSH2クライアントを使うなら、ssh-keygen2を使う
  • 秘密鍵はSSHクライアントのUserKeysに入れておく(接続するユーザの所有にしておく)
  • 公開鍵はログイン先のアカウントの.sshに入れておく
  • 公開鍵はauthorized_keysに追加しておく

作業アカウントとログインアカウントが同で、SSH2クライアントを使うとき

  • SSH2用の鍵ペアを作る
    • ssh-keygen2 -t rsa -b 2048
    • 秘密鍵はクライアント側が持つ
  • UserKeysの公開鍵を変換してOpenSSH用にする
    • ssh-keygen -i -f SSH2公開鍵 > OpenSSH公開鍵
    • サーバ側のアカウントの.sshへコピー
    • パスワード無の場合、.ssh内のauthorized_keysに付け足す

あれ?秘密鍵はネットワーク上を通るわけないんだから、作成ユーザは関係ない気がする...

やりなおし

秘密鍵と公開鍵の意味を勘違いしていたため、鍵はログインユーザが作らないといけないと思い込んでいた。秘密鍵はクライアント側で作られ、公開鍵がサーバに置かれることになっている。このため秘密鍵はネットワーク上を動く必要が無い。公開鍵がサーバに置かれる都合上、ログイン名が変わるのは当たり前。これにどうして気付かなかったのか...

アクセス権については「SSHで公開鍵認証を使う」参照。

  • 鍵を作る: ssh-keygen2 -t rsa -b 2048
  • 公開鍵をサーバへ: 今回は同一PC内なのでコピペ
  • 公開鍵の移動と変換: ssh-keygen -i -f 公開鍵.pub >> /home/ユーザ/.ssh/authorized_keys
    • 必要なら所有者とアクセス権設定を行う
    • .sshディレクトリ: 700
    • authorized_keys: 600
  • ログインしてみる...
    • 結果はOK。

作業ユーザから設定対象ユーザへ権限を渡す為には...2つCygwinを起動した。片方は作業ユーザから起動する(cygwin.batを起動するだけ)。もう一方は、runasを使って、設定対象ユーザの権限でcygwin.batを起動する。作業は以下のようにすればOKなはず。

  • 作業ユーザで鍵を作り、秘密鍵をクライアントに置く
  • 公開鍵は作業ユーザのcygwinからssh-keygenで形式変換をして、どちらのcygwinからもアクセスできるところに置く
  • chmodで設定対象ユーザから読めるようにする
  • 設定対象ユーザのcygwinから、catを使ってauthorized_keysへ追加する


原因は?

たぶんmkpasswd忘れ。途中で何度か消したり追加しなおしたりしたので、それを反映し忘れたのかもしれない。(余り納得できないけど)

SSHからSVNを操作する

SSHを用いた安全なsvnserveを参考にする。TortoiseSVN と併せた SSH のテストには、SSHアカウントは1つだけで、SVN側でユーザ識別させるとか...アカウントをたくさん作らずに済みそうで安心。

Authorized_keysに追加する

authorized_keysは普通は「rsa ****(鍵情報)****」となっているが、これを書きかえる。「TortoiseSVN と併せた SSH のテスト」に書いてあるように、「command=...」を先頭に付け加えることで、svnserveをトンネルモードで起動する。

同じユーザでも異なる鍵を用意すればコマンドを分けることができる。結果として1つのユーザアカウントで複数のSVNユーザログインができるようになるという。

ファイルサーバへつなぐには

Cygwinからファイルサーバ(Sambaらしい)へアクセスする方法を「Life with Cygwin 3」で見つけた。ただ、説明にあるようなログイン画面は出て来なかった。

cygstart //ファイルサーバ名
ls //ファイルサーバ名/ユーザ名

とするとパーミッションが無いといわれる。現在ログイン中のユーザ名が、ファイルサーバ上の名前と違うためだろうか。調べたところ、「sambaにアクセスするユーザの切り替え」で改めてSambaにログインしなおす方法があるとわかった。これを使ってみる。

net use
    ネットワーク接続一覧が表示される
net use \\ファイルサーバ\ユーザ名  /delete
    接続一覧にあるものでないと「みつかりません」と言われる
    大文字・小文字が区別される
net use \\ファイルサーバ\ユーザ名 

いったんログインすると?