はじめに
初めましての人も、そうでない人もこんにちは!
社会人になってから思った以上にLinux(Unix)を触る機会が増えて、毎日勉強の日々ですw
最近、個人開発の一環でAWS上の「同一アカウント / 同一VPC内」のEC2インスタンス同士でファイル転送を行う必要がありました。
そこで scp コマンドを使おうとしたのですが、少しハマったポイントがあったので、今回は備忘録も兼ねてまとめてみます!
SCPコマンドとは?
scp はSSHを利用してコンピュータ間でファイルを安全にコピーするコマンドです。
Linux環境ではかなりよく使われます!
基本的な構文はこちらです。
scp [オプション] [コピー元ファイル] [ユーザー名]@[接続先IPアドレス]:[保存先ディレクトリ]
例えば以下のように使います。
scp sample.txt ec2-user@192.168.1.10:/home/ec2-user/
この場合、
sample.txt- 接続先EC2の
/home/ec2-user/
へ転送されます!
なお、接続先に同名ファイルが存在する場合は上書きされます。
よく使う -i オプション
SCPコマンドで特によく使うのが -i オプションです。
scp -i sample.pem sample.txt ec2-user@192.168.1.10:/home/ec2-user/
これはSSH接続時に使用する秘密鍵ファイルを指定するオプションですね!
今回の問題
ただ今回は問題がありました。
なんと秘密鍵ファイル(.pem)を消してしまいました…。
(皆さんは本当に気をつけてくださいw)
つまり、
-
-iオプションが使えない - 通常の公開鍵認証ができない
という状態です。
では、どうやってSCPでファイル転送を行うのでしょうか?
SCPを使うにはSSH接続が必要
SCPは内部的にSSHを利用しています。
つまり、SCPが成功するためには「SSH接続できる状態」である必要があります。
通常は公開鍵認証を使いますが、SSHにはもう1つ認証方法があります。
それが「パスワード認証」です!
パスワード認証を使う
今回はSSHのパスワード認証を利用して接続を行いました。
まずはSSH接続を試します。
ssh -l [ユーザー名]@[接続先IPアドレス]
例えばEC2ならこんな感じです。
ssh -l ec2-user@192.168.1.10
するとパスワード入力を求められるので、接続先に設定したパスワードを入力します。
認証が成功すればSSH接続完了です!
SSH接続できたらSCPで転送
SSH接続が成功するということは、SCPも利用可能になります。
実際には以下のように実行できます。
scp sample.txt ec2-user@192.168.1.10:/home/ec2-user/
するとパスワードを求められるので、SSH接続時と同じパスワードを入力します。
これでファイル転送完了です!
EC2でパスワード認証を使う時の注意点
EC2ではデフォルトでパスワード認証が無効になっていることがあります。
そのため、/etc/ssh/sshd_config を編集して設定を変更します。
PasswordAuthentication yes
また、rootユーザーのログイン設定も確認します。
PermitRootLogin yes
ただし、PermitRootLogin yes はセキュリティリスクが高くなるため、実運用では以下のような設定がよく使われます。
PermitRootLogin prohibit-password
これは「rootログインは許可するが、パスワード認証は禁止」という設定です。
つまり、秘密鍵認証のみでrootログイン可能になります。
さらに、より制限を強くしたい場合は以下もあります。
PermitRootLogin forced-commands-only
こちらは、SSHキーにコマンド制限が設定されている場合のみrootログインを許可する設定です。
バックアップ処理や自動化用途などで使われることがあります。
設定変更後はSSHサービスを再起動します。
sudo systemctl restart sshd
PasswordAuthentication を yes にしておく考え方
個人的には、普段は秘密鍵認証しか使わない場合でも、
PasswordAuthentication yes
にしておく運用もアリだと思っています。
理由としては、「このサーバはどの認証方式を使っているか」を外部から分かりにくくできるためです。
例えば PasswordAuthentication no にしていると、
- 「このサーバは鍵認証だけを使っている」
- 「パスワード認証は無効」
という情報を相手に与えることになります。
一方で yes にしておけば、接続方式をある程度ぼかすことができます。
もちろん、その分パスワード攻撃の対象になる可能性もあるため、
- Security Groupで接続元IPを制限する
- 強力なパスワードを設定する
といった対策は必要です。
まとめ
今回は秘密鍵ファイルがない状態で、EC2間のファイル転送を行う方法をまとめました!
ポイントとしては以下です。
- SCPはSSHを利用している
-
-iが使えなくてもSSH接続できればSCPは使える - パスワード認証を利用すれば転送可能
-
PasswordAuthenticationやPermitRootLoginの設定確認が必要 - rootログイン設定は慎重に行う
- セキュリティ設定には注意
個人的には「SCP = 鍵認証必須」だと思い込んでいたので勉強になりましたw
誰かの参考になれば嬉しいです!