読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

SSHの設定

サーバ側(Ubuntu)でまずSSHのインストール。もしUbuntuServerインストール時に選択していたらインストール不要。 共通鍵、公開鍵の仕組みが分からない人は一番下に解説を付け足しました。 $ sudo aptitude install openssh-server 次にクライアント側(Win)でTeraTermをインストール。 ◆パスワード認証の場合 TeraTerm開いてホスト名にサーバのアドレス(192.168.~.~)。ポートは22のままでOK。色々設定あるけどデフォルトのままでOK。 「プレインテキストを使う」をチェックして ユーザ名: パスワード: はUbuntu ログイン時と同じ。で、ログインできる。 ◆公開鍵認証の場合 ①クライアント側(Win)でTeraTerm等で公開鍵、秘密鍵を作成し、公開鍵をサーバ側(Ubuntu)のauthorized_keysに付け加える方法。 ②サーバ側(Ubuntu)で公開鍵、秘密鍵を作り、公開鍵をauthorized_keysに、秘密鍵をクライアント側(Win)に入れて認証させる方法 この2つがごっちゃになって非常に時間がかかりました。どちらにしろ接続元は「秘密鍵」を持ち、接続先は「接続元の秘密鍵に対応する公開鍵」をauthorized_keysに登録することに変わりはないんですが、初めて作成するときはごっちゃになってうまくいきませんでした。 なにより最初にrootで鍵を作ったくせにsshd_configではルートログインできないようにしてたから「なんで入れないの!?!?」とずっと悩んでました。 以下設定法。①が一般的です。というより②のように秘密鍵を渡すのは普通しないです。 TeraTermで鍵生成(id_rsa、id_rsa.pub) 公開鍵の中身をコピー (ssh-rsa ~~~~ ○○@△△ってやつ) 次にTeraTermでサーバ側にパスワード認証でログインして、 $ ssh-keygen -t rsa (別に自分で.sshフォルダを作れば良いけど、サーバ側でこれをやれば勝手に作ってくれるから少し楽?) $ cd .ssh $ emacs -nw authorized_keysauthrized_keysを開いて、さっきコピーした内容を貼り付け $ sudo chmod 600 authorized_keys あと、もしrootで作ってる場合は所有者やグループがrootで、アクセス出来ないので $ sudo chown user:group -R .ssh/ フォルダ権限も他のユーザに見られないように $ sudo chmod 700 .ssh/ としておいてください。 では確認で、一旦ログアウトして、RSA認証にして ユーザ名:(サーバのログインしたいユーザ。○○@Ubuntuの○○) パスワード:(鍵認証でつくったやつ) とすれば入れます。 authorized_keysに付け加えるのは別に公開鍵をUSBとかでサーバにいれて、 $ cat id_rsa.pub >> authorized_keys でも同じ。ただ上のやり方ならいちいちUSBとか使う必要が無いからオススメかなぁ。 次、一応②の方法 以下のコマンドを打って、公開鍵と秘密鍵のペアを生成。 $ ssh-keygen -t rsa パスワード入力まで完了すると、「.ssh」というディレクトリが生成され、その下に以下の2つのファイルが生成される。  ・id_rsa.pub (公開鍵)  ・id_rsa   (秘密鍵   公開鍵は「authorized_keys」という名前に変更する必要があるので、以下のコマンドを打ちこむ。 $ cat id_rsa.pub >> authorized_keys 秘密鍵をクライアント側にUSBとかで送る。 TeraTerm秘密鍵をそれに指定して、①のやり方と同じくユーザ名、パスワード打ってログイン。 終わり!!あとは # root でのログインを禁止するため,/etc/ssh/sshd_config の以下の行を修正する。 PermitRootLogin no # プレインテキストでのログインを禁止するため,/etc/ssh/sshd_config に以下の行を追加する(または,コメントアウトされている行を修正)。 PasswordAuthentication no とした方が良いかな。ポートも変えたい人は変えるといい。 sudo service ssh restart で変更内容を有効にして完了! ◆authorized_keysにid_rsa.pubを加える別の方法 SSH経由でコマンドを実行する方法を利用します。 またリダイレクトの知識があった方がわかりやすいので、試す方は「リダイレクト」について一読しておくといいです。 通常sshでログインする際には、 $ ssh user@adder $ ssh -i secretkey user@adder という感じで使用しますが、その後ろにコマンドを続けることでリモートサーバでコマンドラインを実行することができます。 $ ssh user@adder date user@adder's password: 2011年 6月 7日 火曜日 09:52:38 JST こんな感じです。またリダイレクトでローカル(SSHの接続元)ファイルに出力することも可能です。 $ ssh user@adder date > date.txt これでローカルのdate.txtに書き込まれます。接続先の情報を接続元へリダイレクトしています。 では逆に、ローカルファイルを接続先へリダイレクトする方法ももちろんあり、これがauthorized_keysにid_rsa.pubを加える別の方法というわけです。 まず例としてローカルのlocal.txtをリダイレクトしてリモートのremote.txtに書き出すことをしてみます。 $ ssh user@adder 'cat > remote.txt' < local.txt ポイントはcatからのリダイレクト文をクォートで囲むことです。これをしないと結局ローカルのファイルにリダイレクトされてしまいます。この例の場合、cat > remote.txtがリモートのコマンドラインで実行されます。 では目的である「authorized_keysにid_rsa.pubを加える」を実行します。 $ ssh user@adder 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub これでリモートの.ssh/authorized_keysに公開鍵が追加されました。 リモートでのリダイレクト>>を間違えないようにしましょう。 あとおそらくこのままだとauthorized_keysの他のキーから改行されずにくっついたりしてしまい、ちゃんと登録されていないことがあるので、一度authorized_keysを見てキーがそれぞれ改行されているか確認してくさい。 ◆共通鍵、公開鍵の仕組み そもそもなんでこんな方法を使うのかが分からないという人用に。 SSHのような遠隔通信はネットを通じて操作するため途中で盗聴されたりしないように暗号化する必要があります。 その方法として共通鍵を使って暗号化する仕組みが生まれました。 sshkey1.jpg このように共通の鍵を作成し、通信したい相手同士で暗号化・復号して使用します。 普通に考えるとこのやり方にたどり着くと思います。 ただこれだと共通鍵(平文パスワード含む)を盗まれた時に対処できなくなります。それに対応するために生まれたのが公開鍵認証です。 sshkey2.jpg ①Aさんが秘密鍵・公開鍵を作成。これはペアで、秘密鍵で暗号化したものは公開鍵でしか復号できません。反対に、公開鍵で暗号化したものは秘密鍵でしか復号できません。 ②通信したい相手(Bさん)に公開鍵をあげます。 ③公開鍵をもらった相手はそれを使って共通鍵を暗号化します。 ④暗号化した共通鍵を元の相手(Aさん)に渡します。 ⑤暗号化した共通鍵はAさんの持つ秘密鍵でのみ復号できるので、お互いが安全に共通鍵を持つことができます。 ⑥共通鍵を用いて暗号化通信をします。 このように共通鍵で一番問題だった、鍵の共有の部分自体にも暗号化を用いることで安全に共有することが可能になります。公開鍵は誰にでも公開できます。なぜならたとえ第三者が公開鍵を持っていたとしても、暗号化した共通鍵の復号はAさんの持つ秘密鍵でしかできないからです。秘密鍵はAさんがずっと持ち続け、誰にも見せないので安全というわけです。 ソース: sshd_configの設定項目 SSH経由でコマンドを実行する