・ sshの使い方がわかるようになる
・ sshに関するハマりポイントを聞いたことがある状態にする
・ sshを使うときに便利なツールやプログラムを聞いたことがある状態にする
sshについて
一般的な座学
sshとは
- S ecure Sh ellの略でSSH
-
ネットワーク経由で他のコンピュータに接続し、遠隔操作するための仕組み(プロトコル)
- 通信内容が全部暗号化されるので安全
-
OpenSSH
- sshプロトコルを使うためのオープンソースのソフトウェア
- Unix/Linux OS でデフォルトでインストールされている
sshの仕組み
-
ユーザーがログインするまで
-
ホスト認証
- 対象のサーバが本当にユーザがログインしたいサーバかどうかを確認
-
ユーザ認証
- ユーザーが対象のサーバにログインできるかどうかを確認
-
ホスト認証
ホスト認証の仕組み
クライアントが接続するサーバが正しいものかを確認する
-
ホスト認証の必要性
-
暗号を使わなかったら?
- 素のデータがネットワーク上を流れるので第三者に盗み聞きされる
-
クライアントとサーバ間を暗号化すると
- 第三者からの盗み聞きはできなくなるが…?
-
なりすましによるパスワード盗難
- 第三者が偽のサーバを仕掛けておいてパスワードを収集する手法がある
-
暗号を使わなかったら?
-
なりすましを防ぐ仕組み
-
ホスト鍵
-
ホスト鍵はホスト公開鍵とホスト秘密鍵に分かれており、 クライアント上には通常
known_hosts
と呼ばれるファイルがあり、 ここには特定の IPアドレス (とホスト名) をもつサーバのホスト公開鍵が登録されている。 - ホスト秘密鍵はサーバのディスクに格納されている
-
ホスト鍵はホスト公開鍵とホスト秘密鍵に分かれており、 クライアント上には通常
-
クライアントは
known_hosts
に登録されている公開鍵とホストから送られてくる公開鍵を照合,サーバが対応する秘密鍵を持っているかを確認する
-
ホスト鍵
-
ホスト認証は通常 (最初の 1回目を除いて) クライアントによって自動的に行われる.
- ホスト認証を行うにはログイン先のホスト公開鍵をあらかじめ知っている必要がある
- 1回目はクライアントはサーバが送ってきたホスト公開鍵の 指紋 (fingerprint) をユーザに提示し、 これが本当にユーザの接続したいサーバのものであるかどうか確認を求める
-
ちゃんとするなら指紋が
ac:62:6e:32:7e:6f:bc:6a:2f:a1:e5:f3:a5:db:7f:c0
であることをサーバ管理者などに問い合わせる必要がある -
サーバのsshdをアップデートする際には以前と同じホスト鍵を使わないと第三者がなりすましているように見えてしまう.
- このような表示になるため接続しないようにする
ユーザ認証の仕組み
サーバがユーザーが正しいかを確認する
-
クライアントが正しいサーバを確認したら、つぎはサーバのほうが 正しいユーザかどうかを確認する。 OpenSSH のユーザ認証には大きく分けて 2つの方式がある.
- ユーザがあらかじめ登録したパスワードを使った認証 (パスワード認証)
- ユーザがあらかじめ登録した秘密鍵・公開鍵ペアを使った認証 (公開鍵認証)
- パスワード認証はネットワーク上に流るため,公開鍵認証が推奨される
- 公開鍵認証を使うと認証エージェントが使える
ssh-agent
- 認証鍵を保持するプログラム
- パスワードなしでssh接続が可能になる
- サーバ①からサーバ②にアクセスするとき、サーバ①に鍵を置かずにサーバ②にアクセスが可能になる
- ssh-agentに鍵を登録
ssh-add [鍵の場所]
- ssh-agentに登録された鍵の確認
ssh-add -l
ssh config
-
ssh経由でのリモートサーバーの接続する際に利用される設定ファイル
Host 任意の接続名 HostName ホスト名 User ユーザー名 Port ポート番号 IdentityFile ~/.ssh/hoge.key # 鍵へのパス
ssh/configを設定することでこのようなコマンドが
ssh -i ~/Downloads/emtg-server-ope-2024.pem ec2-user%{public ip}:22@192.0.2.0 -p22
このように省略できる
ssh 任意の接続名
多段ssh
-
サーバを外部ネットワークに配置すると自分以外にも外部からの攻撃や不正なアクセスが試みられる
- そのため外部ネットワークを制御するために外部ネットワークと内部ネットワークの間に踏み台サーバを設置することある
- このような構成では目的のサーバにアクセスするために踏み台サーバにsshして、そこからさらに目的のサーバにsshする必要がある
-
OpenSSHではこのようなssh接続に対して
ProxyJump
やProxyCommand
というオプションがある
chmod 600 ~/Downloads/emtg-server-ope-2024-admin.pem
ssh-add ~/Downloads/emtg-server-ope-2024-admin.pem
Host emtg-scixxxx
HostName 192.0.2.0
User ec2-user%{自分のサーバip}:22
Port 22
AddKeysToAgent yes
IdentityFile ~/Downloads/emtg-server-ope-2024.pem
LocalForward 0.0.0.0:10013 192.0.2.2:22
Host emtg-admin
HostName 127.0.0.1
User ec2-user
Port 10013
IdentityFile ~/Downloads/emtg-server-ope-2024-admin.pem
ssh emtg-scixxxx
ssh emtg-admin
scpについて
一般的な座学
- Secure Copyの略
- ネットワーク上に暗号化された伝送経路を構成して別のサーバを遠隔操作するsshのコマンドの一つで、ローカルとの間でセキュアにファイルを送受信する。
-
他にもsshを介してファイルを転送するプロトコルとしてSSH File Trancefer Protocol(SFTP)があり、scpの方が軽量だが、SFTPの方が高機能とされている。
- OpenSSH 9.0以降ではscpコマンドがSFTPプロトコルをデフォルトで使用するようになっている
scpでファイルをコピー
-
リモートサーバからローカルサーバへファイル転送
scp [コピー元のローカルファイル] [リモートサーバのユーザ]@[リモートサーバのIPorホスト名]:[コピー先のディレクトリ]/[ファイル名]
-
リモートサーバからローカルサーバへファイル転送
scp [リモートサーバのユーザ]@[リモートサーバのIPorホスト名]:[コピー元のファイルパス] [ローカルサーバのコピー先ディレクトリ]
scpでディレクトリをコピー
-
ローカルサーバからリモートサーバへファイル転送
scp -r [コピー元のローカルファイル] [リモートサーバのユーザ]@[リモートサーバのIPorホスト名]:[コピー先のディレクトリ]
-
リモートサーバからローカルサーバへファイル転送
scp -r [リモートサーバのユーザ]@[リモートサーバのIPorホスト名]:[コピー元のファイルパス] [ローカルサーバのコピー先ディレクトリ]
使い方
-
準備: サーバに入って適当なファイルを作る(
{各自サーバのIPアドレス}
を置き換えて使ってください)[ローカル ~]$ ssh -i ~/downloads/emtg-server-ope-2024.pem ec2-user%{各自サーバのIPアドレス}:22@192.0.2.0 -p22 [ec2-user@hogehoge ~]$ vi test.txt (iを押して編集モードへ) 何か適当に文字を入れる (ctrl + c もしくはEscで編集モードを終了) (:wqを入力しEnterで保存) [ec2-user@hogehoge ~]$ ls test.txt <- ファイルがあることを確認する
-
ローカルから
scpしてみる(別のターミナルを開く)
今回のコマンドは、リモート→ローカルでファイル転送するもの。[ローカル ~]$ scp -i ~/downloads/emtg-server-ope-2024.pem -P 22 -A -o user=ec2-user%{各自サーバのIPアドレス}:22 192.0.2.0:~/test.txt ~/test.txt test.txt 100% 34 1.5KB/s 00:00 <-ファイルが転送される
便利なアプリケーション
ローカルとサーバでファイルのやり取りをする機会は意外とあって、その度に前節でやったscpコマンドを思い出すのはキツい。。。
ということでニフティ社内ではアプリケーションを使ってローカルとサーバでファイルのやり取りをしているケースが多いです。
ファイル転送のみならずファイル管理や操作ができるのでおすすめ
WinSCP
- windowsユーザー向け
Cyberduck
- macユーザー向け
他にも色々あるので好きなのを使えばいい
https://filezilla-project.org/
https://panic.com/jp/transmit/