scpで踏み台サーバーに秘密鍵をコピーするのに躓く

scpって何?なんで「Permission denied」って出るの?(初心者の叫び)
2020.03.12

AWS初学者のあるある(ベテランさんも初心者が何が分からないのかがわかるかもしれませんのでどうぞ)

恐らく多くのAWS初学者がハマる、踏み台サーバーを経由してインターネット接続されていないサーバーへSSHで接続する際の、踏み台サーバに秘密鍵をコピーするのに必要なコマンド、

% scp -i watashi-no-key.pem watashi-no-key.pem ec2-user@IP-address:~/path

でまんまとハマりましたので、顛末を記します。

初心者のみならず、こんなことで躓いたことすらない若しくは忘却の彼方のベテラン開発者の方も、大歓迎です。初心者の頭の中を覗いて、初心者VSベテランの相互理解を深めませんか。

実行環境

macOS 10.15.3

エラーの旅路

最初は、よく分からずに本に書いてあるコードをそのまま書きました。

% scp -i watashi-no-key.pem watashi-no-key.pem ec2-user@IP-address:~/path
cp: watashi-no-key.pem: No such file or directory

そんなファイルもディレクトリもないと言われしまい、仕方がないので(小声)、scpについてググることにしました。さらっと調べた結果、一方はファイルパスであると書いてあり、その時はデスクトップにpemファイルを置いていたので、以下の通り実行しました。

% scp -i watashi-no-key.pem ~/Desktop/watashi-no-key.pem ec2-user@IP-address:/path
cp: ec2-user@IP-address: Permission denied

そして、Permission deniedと言われます。(ここでこのブログのタイトルを付けました)

そんじゃあ、ファイル名とパスが逆じゃったかのうと思い逆にして実行!

% scp -i ~/Desktop/watashi-no-key.pem watashi-no-key.pem ec2-users@IP-address:/path
Warning: Identity file watashi-no-key.pem not accessible: No such file or directory.
ec2-users@IP-address: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
lost connection

そんなファイルはないと言われてしまいました。(しかし、エラーの文言が違うのが気になります。)

本ではさらっと書かれているのに、私は一体何をそんなに悪いことをしたのかと色々と検索をしていたら、以下のブログの一文が目につきました。

その前に、秘密鍵を自分のホームディレクトリに置いておいて下さい。

まさか、そんな...秘密鍵をホームディレクトリに?

しかし、ものは試し、早速デスクトップに置いている、watashi-no-key.pem をホームディレクトリに移動し、再実行!

% scp -i watashi-no-key.pem watashi-no-key.pem ec2-user@IP-address:/path
watashi-no-key.pem  

無事コマンドが通りました。

scpコマンドについて調べる

Permission denied (publickey,gssapi-keyex,gssapi-with-mic)をキーワードにググったところ、下記の懇切丁寧なページにたどり着きました。

また、よくPermission deniedで検索をするとchmod xxx file_nameで権限を変更して解決!という記事を見るのですが、恐い怖い!いくら無知故怖いもの知らずである初心者でも、本能的にそのコマンドを実行するのは手に汗握ってしまいます。

ですが、上記ページにはその権限についても解説がありました。

公開鍵認証する場合、接続先のサーバで所有者とパーミッションが適切に設定されていることを確認します。

  • /home/user/.ssh は 0700
  • /home/user/.ssh/authorized_keys は 0600

にします。パーミッションに過不足があるとエラーになることがあります。

調べるたびに色々出てきたあの数字たちにはこんな意味があったのですね。

なんとなくわかってきたので、思いついたことを試す

さてブログタイトルにもなっているもう一つの疑問、「scpってなんなの?」についても調べたところ、色々とわかっちゃいました。

まず、「scpってなんなの?」の答えは、Secure Copyのことでした。ターミナルでも使用するcpコマンドのssh通信ができるコマンドみたいです。 ですので、シンプルにローカルからリモートへコピーしたい場合にはcpコマンドと同じくscp copy_from copy_toと書けばよいこと。

そして、-iというオプションは、identity_fileから取ったもので、どのファイルがidentityなのかを指定するオプションであること。

ということは、私が最初に躓いたあのscpコマンドは、たまたま認証用ファイルを使用して認証用ファイルをコピーしようとしたから同じファイル名が二つ並んでややこしい感じになっていましたが、認証ファイルを利用して別のファイルをコピーすることもできるはず。そして、お手本としてはその方がよっぽどわかりやすい!

早速やってみます。

% scp -i watashi-no-key.pem certificate.pdf ec2-user@IP-address:~/path
certificate.pdf

はい!できました。一応コンソールに入って確かめます。

user_name ~ % ssh -i watashi-no-key.pem ec2-user@IP-address                     
Last login: Wed Mar 11 16:23:11 2020 from 

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
1 package(s) needed for security, out of 26 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-x-x-x-x ~]$ ls
certificate.pdf

無事コピーできていることが確認できました。

しかし、これではコピーできるのはホームディレクトリからだけなのでは?という疑問を拭きれません。

それならば試すのみ!早速別のファイルをデスクトップに移して実行します。

% scp -i watashi-no-key.pem ~/Desktop/certificate-getting-started.pdf ec2-user@IP-address :~/
certificate-getting-started.pdf 

% ssh -i watashi-no-key.pem ec2-user@IP-address                    
Last login: Wed Mar 11 16:31:02 2020 from 

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
1 package(s) needed for security, out of 26 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-x-x-x-x ~]$ ls
certificate-getting-started.pdf  certificate.pdf

デスクトップからでも無事にコピーができました。

まとめ

ブログを書くことで、scpコマンドで行えることについての理解を深めることができました。cliは初心者にとっては恐ろしくもあるのですが、一度その意味するところを知ることができると、魔法を使うことができるようになったレベルのワクワクと嬉しさがこみあげます。

これからも当分は初心者投稿が続きますが、それはそれで需要があると信じて、投稿を続けます。

追記 (2020.03.13)

記事の公開後、前述のブログにあるchmod 600を実行したことでPermission deniedが解消したのでは?というコメントをいただきました。

しかし、私がpemファイルに対して行ったのはchmod 400の読み込みのみの権限設定のみだったこと、そしてpemファイルを使用してEC2へSSH接続することはできていたことをお伝えすると、その方が私の出したエラーの原因をまとめてくださったので、その紳士の了承を得て、エラーの原因を追記することにしました。

最初のこの失敗の原因は、鍵も送信対象のファイルも指定したパスになかったため。

% scp -i watashi-no-key.pem watashi-no-key.pem ec2-user@IP-address:~/path
cp: watashi-no-key.pem: No such file or directory

次のこの失敗の原因は、鍵が指定したパスにないため。

% scp -i watashi-no-key.pem ~/Desktop/watashi-no-key.pem ec2-user@IP-address:/path
cp: ec2-user@IP-address: Permission denied

3つ目の失敗の原因は、送信対象のファイルが指定したパスにないため。

% scp -i ~/Desktop/watashi-no-key.pem watashi-no-key.pem ec2-users@IP-address:/path
Warning: Identity file watashi-no-key.pem not accessible: No such file or directory.
ec2-users@IP-address: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
lost connection

今回の顛末をまとめると、scpができなかった背景は、

  • パーミッションは常に正しい
  • 失敗した原因は鍵がホームディレクトリになかったからでもパーミッションが間違っていたからでもなく、常に鍵か送信対象のファイルのパスを間違えていたから

とのことでした。