🚀 ニフティ’s Notion

【サーバ運用入門2024 #1】sshのお作法

🏁この章の目指すところ🏁
sshの使い方がわかるようになる
sshに関するハマりポイントを聞いたことがある状態にする
sshを使うときに便利なツールやプログラムを聞いたことがある状態にする

sshについて

一般的な座学
sshとは
  • S ecure Sh ellの略でSSH
  • ネットワーク経由で他のコンピュータに接続し、遠隔操作するための仕組み(プロトコル)
    • 通信内容が全部暗号化されるので安全
  • OpenSSH
    • sshプロトコルを使うためのオープンソースのソフトウェア
    • Unix/Linux OS でデフォルトでインストールされている
sshの仕組み
  • ユーザーがログインするまで
    • ホスト認証
      • 対象のサーバが本当にユーザがログインしたいサーバかどうかを確認
    • ユーザ認証
      • ユーザーが対象のサーバにログインできるかどうかを確認
image block
引用:
ホスト認証の仕組み

クライアントが接続するサーバが正しいものかを確認する

  • ホスト認証の必要性
    • 暗号を使わなかったら?
      • 素のデータがネットワーク上を流れるので第三者に盗み聞きされる
      image block
      引用:
    • クライアントとサーバ間を暗号化すると
      • 第三者からの盗み聞きはできなくなるが…?
      image block
      引用:
    • なりすましによるパスワード盗難
      • 第三者が偽のサーバを仕掛けておいてパスワードを収集する手法がある
      image block
      引用:
      image block
      引用:
  • なりすましを防ぐ仕組み
    1. ホスト鍵
      1. ホスト鍵はホスト公開鍵とホスト秘密鍵に分かれており、 クライアント上には通常  known_hosts  と呼ばれるファイルがあり、 ここには特定の IPアドレス (とホスト名) をもつサーバのホスト公開鍵が登録されている。
      2. ホスト秘密鍵はサーバのディスクに格納されている
    2. クライアントは known_hosts に登録されている公開鍵とホストから送られてくる公開鍵を照合,サーバが対応する秘密鍵を持っているかを確認する
  • ホスト認証は通常 (最初の 1回目を除いて) クライアントによって自動的に行われる.
    • ホスト認証を行うにはログイン先のホスト公開鍵をあらかじめ知っている必要がある
    • 1回目はクライアントはサーバが送ってきたホスト公開鍵の 指紋  (fingerprint) をユーザに提示し、 これが本当にユーザの接続したいサーバのものであるかどうか確認を求める
    • ちゃんとするなら指紋が ac:62:6e:32:7e:6f:bc:6a:2f:a1:e5:f3:a5:db:7f:c0 であることをサーバ管理者などに問い合わせる必要がある
    • サーバのsshdをアップデートする際には以前と同じホスト鍵を使わないと第三者がなりすましているように見えてしまう.
      • このような表示になるため接続しないようにする

ユーザ認証の仕組み

サーバがユーザーが正しいかを確認する

  • クライアントが正しいサーバを確認したら、つぎはサーバのほうが 正しいユーザかどうかを確認する。 OpenSSH のユーザ認証には大きく分けて 2つの方式がある.
    1. ユーザがあらかじめ登録したパスワードを使った認証 (パスワード認証)
    2. ユーザがあらかじめ登録した秘密鍵・公開鍵ペアを使った認証 (公開鍵認証)
  • パスワード認証はネットワーク上に流るため,公開鍵認証が推奨される
  • 公開鍵認証を使うと認証エージェントが使える

ssh-agent
  • 認証鍵を保持するプログラム
  • パスワードなしでssh接続が可能になる
  • サーバ①からサーバ②にアクセスするとき、サーバ①に鍵を置かずにサーバ②にアクセスが可能になる
    image block

  • 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 任意の接続名
image block
喜びに震える人
多段ssh
  • サーバを外部ネットワークに配置すると自分以外にも外部からの攻撃や不正なアクセスが試みられる
    • そのため外部ネットワークを制御するために外部ネットワークと内部ネットワークの間に踏み台サーバを設置することある
      image block

    • このような構成では目的のサーバにアクセスするために踏み台サーバにsshして、そこからさらに目的のサーバにsshする必要がある
  • OpenSSHではこのようなssh接続に対して ProxyJump ProxyCommand というオプションがある

Icon
多段sshをやってみよう!
~/.ssh/configを次のように書き換える

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/config
自分のサーバにssh接続をする
ssh emtg-scixxxx
ターミナル1
別端末から共用サーバにssh接続をする
ssh emtg-admin
ターミナル2
💡
ssh-agentを使っているため踏み台サーバに鍵を置くことなく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ホスト名]:[コピー元のファイルパス] [ローカルサーバのコピー先ディレクトリ]

使い方
  1. 準備: サーバに入って適当なファイルを作る( {各自サーバの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 <- ファイルがあることを確認する
  2. ローカルから 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/