sftpコマンドでSSH接続をしてファイルを転送する (Windows)-②鍵認証での接続

パスワード認証までできたところで、鍵を生成する。

鍵は公開鍵と秘密鍵がペアで作成される。公開鍵をサーバー側へ渡し、秘密鍵を持って接続する。

サーバー側は接続数の分だけ公開鍵を持つ。

秘密鍵をコピーして使いまわせば、1つの公開鍵の設定だけで、複数の端末から接続可能となるが、秘密鍵の受け渡しはセキュリティ上よくないため、しないほうがいい。

身近なところで言うとgithubも数年前からSSH接続を推奨するようになり、

自分の端末で鍵を生成して、公開鍵をgithubに設定すると、

リモートリポジトリのURLは githubuser@githubxxxxのような形になる。

鍵を作成

以下コマンドで生成

ssh keygen

以下のオプションを付けることが多い

ssh-keygen -t rsa -f id_rsa

-t : 暗号化アルゴリズム

-f : 保存ファイル名

オプションに関しては以下

参考

https://zapping.beccou.com/2021/09/02/about-brssh-keygen-command-options-to-generate-encryption-key-private-key-and-public-key/

パスフレーズは無くてもいいが、第3者に鍵が渡ってしまった場合、パスフレーズがあれば使えないので、設定しておくのもいい。

こうして、公開鍵と秘密鍵ができたので、公開鍵を接続先となるサーバー側マシンに渡す。

公開鍵はid_rsa.pubという名前なので、authorized_keysという名前に変更する。

SFTP接続

公開鍵をサーバーへ渡すために、SSH接続を用いてファイル転送できるSFTPコマンドで行う。

公開鍵はメールでもコピペでもファイル転送ソフトでも渡し方はたくさんあるが、SFTPやSCPで渡すことが一般的か。。。?

SSH接続したサーバー側のユーザーフォルダの下に .ssh というフォルダができていれば、その下に公開鍵を置く。

フォルダがなければ、.sshフォルダを作成する。

公開鍵を接続先へ渡す

以下のコマンドでサーバー側に転送できるが

ssh-copy-id remote_host

今回はsftpコマンドでファイル転送する。

sshと同様、ユーザー名@マシンのIPアドレス or マシン名 とする

sftp username@server_ip

パスワードを入力

ユーザーのホームディレクトリにある .sshフォルダに移動 (ls や pwdコマンドなどでフォルダを確認する) 。

公開鍵はユーザーフォルダの下であればどこにおいてもいいが基本.sshフォルダの下において、このフォルダはユーザーとAdministratorsとSYSTEM以外はアクセスできないようにしておく。

cd ~/.ssh

公開鍵のあるフォルダを指定して、putコマンドで送信する

put .ssh/authorized_keys

接続終了

quit

これで公開鍵を送信できた。

サーバー側の鍵認証設定

  • C:\ProgramData\ssh
  • C:\Windows\System32\OpenSSH

どちらかにsshd_config_defaultというファイルがある。

githubからOpenSSHをインストールした場合は、インストールした任意の場所のフォルダになるが、基本的にOpenSSHというフォルダ名にしたほうがいいだろう。

sshd_config_defaultがあれば、コピーしてsshd_configという名前に変える。

以下のコメントアウトを外す

PubkeyAuthentication yes
PasswordAuthentication no

以下をコメントアウトにする

#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

以上でサーバー側の設定は完了。

鍵認証で接続

以下のコマンドで接続できれば鍵認証は成功している。

ssh -i id_rsa username@server_ip

-i id_rsaの部分は秘密鍵のパスなので、クライアント側の秘密鍵がどこにあるか確認しておく。またルートディレクトリはユーザーディレクトリとなる。

.sshフォルダの下にあるはずなので、

ssh -i ~/.ssh/id_rsa username@server_ip

となるはず。

しかし、sshやsftpコマンドはデフォルトで、.ssh/id_rsaを見に行くので、.sshフォルダの下に秘密鍵を置けば、このコマンドは不要である。

ssh username@server_ip
sftp username@server_ip

で接続できる。

ファイル転送

SSH接続でのファイル転送は、SFTPコマンドやSCPコマンドがある。

・SFTP:接続後対話型のコマンドラインで、ファイル送信PUT, ファイル取得  GETなどのコマンドを使い転送する。複数ファイルの転送もできる。

以下のように接続して送信、取得できる。

sftp username@server_ip
put local/path/file
get remote/path/file

・SCP:SCPコマンドで送信を行う。単一のファイルやフォルダの転送のみ。

ファイル送信

scp /local/path/file username@server_ip:/remote/path

ファイル取得

scp /username@server_ip:/remote/path/file /local/path

参考

https://qiita.com/TukamotoRyuzo/items/7bd4ff6810421bdc9924#5-%E9%8D%B5%E8%AA%8D%E8%A8%BC%E6%96%B9%E5%BC%8F

参考

https://engineer-ninaritai.com/linux-scp/

参考

https://www.digitalocean.com/community/tutorials/how-to-use-ssh-to-connect-to-a-remote-server-ja

SSH接続の設定

セキュリティ的にsftpユーザーはsshコマンドで接続できなくするなど、ユーザーごとに役割を振ってルートディレクトリより上の階層にはアクセスできなくしたほうがいい。

sshd_configに以下を設定する。

ForceCommand internal-sftp
ChrootDirectory <接続時のルートディレクトリのパス>

参考

https://t-dilemma.info/windows-openssh-limit-groups/

sftpコマンドでSSH接続をしてファイルを転送する (Windows)-②鍵認証での接続」への1件のフィードバック

コメントは受け付けていません。