Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
リモート接続周りの話(SSH,リモートデスクトップ等)

GUIのリモート接続

VNCとリモートデスクトップ


SSHではGUIが使えない
GUIのリモート接続を実現するには、VNCやRDPを使う

※リモート接続でなく、ローカルでのCUI⇔GUIは、「runlevel変更.md」を参照のこと

VNCとRDP比較


  • VNCとRDPは、少し違う。

    • リモートデスクトップでは操作するパソコンの画面を横取りするイメージ

    • VNCは操作するパソコンの画面をのぞきこむイメージ

    • 詳しくいうと、RDPは画面の書き換え要求メッセージを送信している

    • VNCは、画面イメージを切り取って転送している

    • つまり、RDPは画面表示に使う情報を送っているが、VNCは画面を送っている

  • VNCが使うプロトコル

    • 上記のように、VNCは画面をそのまま送っているが、やり取りに使うのがRFBプロトコル(Remote Freme Buffer)
    • 画面データそのものをやり取りするので、サーバ側では常にスクリーンをキャプチャし続けてクライアントに送信
    • 画面を複数の領域に分割し、書き換えが必要な部分だけやり取りしたり、データを圧縮したりしてこの膨大になりそうなデータのやり取りを実現している
  • RDP

    • これに対し、RDPは画面描写に必要なデータをやり取りして、クライアント側で描写するイメージ
  • メリットデメリット

    • VNC

      • 基本的に便利
      • VNCは画面を閉じても処理は継続されるので、時間がかかる処理ができる
      • しかし上記のように画像データをやり取りしているので、重い
      • なので、LAN内では使えるかもしれないが、離れてたり通信帯域が狭いとおっそい
      • インストールしなければ使えない
      • VNCは画面データをやりとりしている関係で、基本的にユーザは1人(同時多数接続に不向き)
    • RDP

      • インストール必要ないことが多い(Windonwsでプリインストールされていることが多い)
      • 画面データに必要なデータをやり取りしているので、同時多数接続に向いている
      • RDPでは使えないアプリ・ソフトがある

scp,sftp,ftpsの違いについて

SCP


scpは、SSHを使用したファイル転送プロトコル
scpのクライアントプログラムは、sshサーバに命令を出す。
sshサーバは命令に応じて、シェルを起動させ、自分のscpプログラムを起動し、コマンドを実行させる(-f付き)
つまり、scpコマンドを打つことで、相手のsshサーバにscpクライアント宛の「scp -f ○○ 」というコマンドを実行しなさいという命令を出している。
通信にはSSHの暗号化を使っている

SFTP


SSH File Transfer Protocol
sftpクライアントは、sshサーバに対してコマンドを送る。ここまではscpとおなじ
sshサーバは、sftpサーバを起動させて接続しないという命令を受け取る。
起動させるのはscpでなくsftpサーバ。シェルは基本的に不要
通信にはSSHの暗号化を使っている
パケットの確認を行っているので、信頼性が高い

FTP


暗号化されないファイル転送プロトコル

FTPS


File Transfer Protocol over SSL/TLS
FTPで送受信するデータをSSLまたはTLSで暗号化するプロトコル

SCP vs SFTP


項目 SCP SFTP
ポート 22 22
速度 速い 遅い
信頼性 低い 高い
転送の再開 できない できる
ファイル名の変更 可能 可能
ファイルの複製 可能 不可
コマンドの実行 可能 不可
シェル 必要 不要
特徴 シンプルで軽快 高機能でやや重い

参考


http://qiita.com/cyberblack28/items/275c5df386a50b224765
図があってわかりやすい
ここに書いてあることのメモとしてのこのgist記事

SSH接続

ターミナルとコンソールについて


  • ターミナルの意味は終端装置
    • 末端機器(電話やテレビなど)を指している
  • コンソールは元はコンピュータを操作するためのもの(画面、卓)
  • TSS(time sharing system: 1台のPCを複数人で同時利用)が出たときに、コンソールをたくさんつないで利用したので、それらのコンソールをターミナルと呼んだ
  • UNIXもTSSの機能を持つ
    • UNIXでは、カーネルと直接対話する装置をコンソール、
    • 外部ネットワークから接続する装置をターミナルと呼ぶ

SSH


  • Secure SHellの略
  • リモート(遠隔)のサーバにログインしてサーバを操作するためのプロトコル
  • パスワードやデータを暗号化して通信する
  • クライアントがサーバに接続する時、接続先が意図しないサーバに誘導されていないかチェックする
  • 通信が暗号化されているので(telnetよりは)安全 (と思ったらこんな記事が)
  • CentOSでは、OpenSSHサーバがデフォルトでインストールされて自動的に起動している
  • OpenSSHはSSH接続を行うためのアプリケーション

状態確認


  • lsof

    • LiSt Open Files(開いているファイルのリスト)
    • Linuxはいろんなものをファイルとして扱っている→ 開いているファイルを調べるといろいろわかる sshd(sshデーモン)が起動しているか確認するときは、オプションi(ネットワークソケットファイルを表示)と、ポート番号22を指定して、 lsof -i:22とする
    • sshdLISTEN(待機)になっていればOK
    • lsof自体は、あるファイルを開いているプロセスや、あるポートにアクセスしているプログラムを特定し、不要なプロセスやプログラムがないか確認するようなときに使うらしい
    • lsofはファイルを開くので、ルート権限
  • lsofについてはこの記事が参考になりそう

  • lsofの結果を少し見ていると、FDという項目があったので調べてみた。ファイルディスクリプター(File Descriptor)の略。 FDについてはこれとかこれが参考になりそう

SSHのログイン認証

  1. ユーザ名とパスワード(・サーバ証明書)を使った認証

  2. 公開鍵・秘密鍵を使った認証 (TeraTerm(Windows環境)でも2つとも可能)

    1. ユーザ名とパスワードを使った認証

    • ユーザ名とパスワードがわかれば接続できてしまうので、公開鍵・秘密鍵の方が安全
    • ssh コマンドを使う
    • ssh ユーザ名@接続先
      • -v オプションでデバッグモードで接続する
      • -i オプションで使う鍵を指定できる
      • -p でポート番号指定
      • -F 設定ファイルを指定(デフォルトでは~/.ssh/conffigを使用)
    • 接続先にはIPアドレスも使えるし、ホスト名も使える
      • ホスト名の設定は /etc/hosts をいじる→ viで、xxx.xxx.xxx.xx ホスト名 別名 と追加すると名前解決してくれる(別名は省略可)
      • ex) user@xxx.xxx.xx.xx
      • ex) user@name
    • 初回接続時に、SSHサーバ証明書がサーバ側から送られてくる。ここで尋ねられているのは接続を続けますかということ(yesで接続される)
    • 接続を切るのは exit コマンド
    • 初回接続が完了すると、クライアント側のホームディレクトリに .sshディレクトリが作られ、その中に kown_hosts というファイルができる
    • この known_hosts の中身に、SSHサーバ証明書がある
    • 接続に際しては、サーバがSSHサーバ証明書を送り、クライアント側が自分の持っているもの(~/.ssh/kown_hosts)と比べて、一致すれば接続を許可する形になっている(なりすましを防ぐ)
    • 仮に証明書をコピーして接続を試みても、SSHサーバには秘密鍵と公開鍵が必要なので、その時にはじかれる
    • 注意として、サーバの再インストールを行うと、サーバ側のSSHサーバ証明書は再作成され変更されてしまう
      • その時にはクライアント側のknown_hostsvi等でいじればよい
    • hostsは、OSから見たホスト名ということ
    2. 公開鍵・秘密鍵を使った認証

    • サーバ側で、クライアントの公開鍵を使って暗号化し、それをクライアント側で、自分の秘密鍵で復号する

    • 流れは、公開鍵/秘密鍵のペアを作成→クライアントに公開鍵と秘密鍵設置→サーバに公開鍵を設置

      ペア鍵の作成
      • 公開鍵/秘密鍵の作成コマンドは、ssh-keygen

      • クライアント側でこのコマンドを打つと、少しだけ楽

      • ssh-keygenを打つと、鍵の設置場所とパスフレーズの入力が求められる

        • デフォルトでの設置場所は、.sshになっている
        • .sshが基本だけど、安全を期す場合にファイル名を変えたり、違うファイルにしたりする
        • パスフレーズは、秘密鍵を守るパスワード(鍵の鍵みたいなイメージ)
        • パスフレーズなしで作ることも多い(何も入力せずEnter)
      • コマンドを実行すると、設置場所にファイルが自動的に作られる

      • ssh-keygenコマンドで作ると、パーミッションは適切になっているはず

        • 他のマシンで作った鍵をコピーする際には、パーミッションを変更する必要がある
        • 適切なパーミッションは、.sshディレクトリで700、公開鍵()rsa.pub)で644、秘密鍵(id_rsa)で600
        • .sshを自分で作った場合や鍵置場を別の場所にした場合、自動ではパーミッションが変換されないので注意
        • id_rsaとかは、デフォルトの名前で、かつデフォルトで使用できる設定になっている
      • 鍵ファイルの所有者は、sshコマンドを実行するユーザでないといけないので、ssh-keygenを実行するときはそのユーザで実行する

      サーバ側への公開鍵の設置とファイル転送
      • ファイル転送の方法は、ftpscp
      • scpだとオプション(-r)でディレクトリごと転送可能
      • scp コピー元ファイル(~/.ssh/id_rsa.pub) ユーザ名@接続先:コピー先ディレクトリ指定
      • サーバ側で.sshのパーミッションを適切に設定し、touchコマンドなどでauthorized_keysファイルを.sshディレクトリに作成
      • id_rsaの中身をcat >> authorized_keys(リダイレクト)などとしてauthorized_keysに追加
        • authorized_keysはほかの公開鍵も追加していくので必ず>>を使う
        • この時mvcpを使うと上書きする可能性があるし、SELinuxというセキュリティが有効になっていると上手くいかない可能性があるので非推奨
        • 実は、転送ファイル作成中身追加まで自動でやってくれるコマンドがある→ssh-copy-id ユーザ名@接続先
      • scpは、SSHプロトコルを使用したファイル転送を実現する
      • sftpというものもある
        • SSH File Transfer Protocolの略。SSHを使用してファイルの送受信ができる
        • sftp ユーザ名@接続先とうって、sftp >と表示されればOK
        • sftpでは、put ファイル名(クライアント→サーバ),get ファイル名(サーバ→クライアント)の他に、lsやcd,pwd,put,rm,mkdir,rmdir等のコマンドがあり、これらはサーバ側のファイルやディレクトリ操作となる。クライアント側のコマンドは、lpwd,lls,lcd,lmkdirなど、lがつく
      • scpとsftpとftpsについては別gistファイル参照

    ####TeraTermを使ったSSH通信

    • TeraTermを使えばWindowsでもOpenSSHサーバに接続できる
    • パスワード認証は普通につなげば大丈夫(初回のみ警告が出る→サーバ証明書がknown hostsリストに登録されていないため)
    • 公開鍵/秘密鍵での接続は、設定・転送が必要
      • 「設定」メニューから「SSH鍵生成」を開き、鍵の種類がRSAとなっていることを確認し、「生成」ボタンクリック
      • パスフレーズを入力し、「公開鍵の保存」「秘密鍵の保存」をそれぞれクリックしてローカルに保存
      • 「ファイル」ファイルメニューから、「SSH SCP」を開く、「From」の欄に公開鍵ファイルを指定して「Send」
      • 後は、サーバ側で上記の様にauthorized_keysに公開鍵を追加
      • TeraTermを接続する際に、RSA/DSA/ECDSA/ED25519鍵を使うにチェックを入れ、秘密鍵を指定し、ユーザ名・パスフレーズを入力して接続

パスワード認証の禁止と管理者ユーザ(root)のログイン禁止

OpenSSHサーバの設定を変更し、パスワード認証を禁止する

  • OpenSSHサーバの設定ファイルは /etc/ssh/sshd_config

  • これをvi等でいじる

    • PermitRootLogin nonoに変更
    • PasswordAuthentication nonoに変更
    • service sshd restartsshd再起動
  • 基本的にrootを開けておくことはせず、su - によってrootを使わせる

  • また、.ssh/configという設定ファイルを書くと、かなり楽になったりする

    • ex) 以下のような設定を書くと、ssh hogeとするだけで接続可能になる

Host hoge
    HostName ホスト名
    User ユーザ名
    Port ポート番号
    IdentityFile 鍵のパス ← このホストにはこの鍵を使ってーということができる

OpenSSH日本語マニュアル
↑ここで多分全設定項目が書いてある

例えば、踏み台サーバにsshで接続してさらに作業対象サーバにsshで接続するような方法をとった場合、踏み台に秘密鍵を置くことになるし、コマンドを2回実行するので面倒
⇒**.ssh/configに書けば、多段SSH接続の設定ができ、一発で作業サーバに接続できる**

Host host2

Host host3
    ProxyCommand ssh -w %h:%p host2
Host host4
    ProxyCommand ssh -w %h:%p host3

↑これでhost2に接続すると一発でhost4に接続できる、、、、らしい。

踏み台について。4台と接続したいという状況で、4台すべてネットにつながっているとセキュリティ的に面倒。したがって、1台だけつながるようにして他3台のネットをつぶす。そして1台を踏み台にして3台とつなげられれば、踏み台のセキュリティを1台ガチガチにするだけでよい。この1台を踏み台という

~/.ssh/内のファイル

authorized_keys
- 接続を許可する公開鍵を登録しておくサーバ側のファイル
config
- SSH接続の情報を書くファイル
id_rsa
- 秘密鍵
id_rsa.pub
- 公開鍵
known_hosts
- 過去に接続したことがあるサーバ

OpenSSHでは~/.ssh/内のファイルのパーミッションが600でないと使用できない


参考

Qiitaのこの記事

VPNについて

VPN概要


VPNとは、Virtual Private Network の略で、仮想的なプライベートネットワークを作る技術のこと。
例えば離れた拠点間と通信する際に、インターネットを使用すると盗聴・改ざん・なりすまし等の脅威にさらされることになるので、機密情報のやり取りには向いていない。
従来であれば専用線をつなぐことで、閉域網を作り機密情報のやり取りを行うことが主流であったが、こちらは拠点間の距離などによってコスト面での問題があった。
また、専用線をつなぐ以外にも、Webベースでの暗号化接続を提供するSSL(Secure Socket Layer)やメールの暗号化が用いられてきた。
しかし、サービスの多様化に伴い、安全な通信を行う際にアプリケーションごとに異なる技術を用いるのはめんどくさくなってきた。

これ等の問題を解消するのがVPNで、
VPNは、トンネリングと暗号化という技術を用いてプライベートなネットワークを形成する。
VPNによってコストを抑えつつ、専用線の様に安全な通信ができる環境を準備できる。

VPNの特徴(トンネリングと暗号化)


  • トンネリング
    端末間のすべての通信を束ねることで、ルーター間の通信に見せかける技術。
    パケットに新しいヘッダを付け加え、カプセル化して通信を行う。データ送信側も受信側もトンネリングされていることを意識することはない。
    なので、使用中のシステムの変更を必要としない。

  • 暗号化
    トンネリングされたパケットの盗聴や改ざんなどを防止するためにパケットを暗号化して伝送する技術

以上が、インターネットVPNの特徴。

VPNにはIP-VPNという種類もある。
IP-VPNには、MPLS(Multi Protocol Label Switching)という技術が利用されている。
これは、ルータの役割から通信経路選択を奪う(パケットに経路を含めてしまう)ことで、高速大容量通信を可能にする。

インターネットVPNは、あくまで一般的なインターネットのアクセス回線を利用しているのに対し、
IP-VPNは、通信事業者が独自に保有する閉じたネットワークを利用する。

インターネットVPNが安定性や信頼性よりもコストを重視しているのに対し、IP-VPNは安定性や信頼性を重視する。

(インターネット)VPNに使われるプロトコル


VPNは専用プロトコルを使用して通信するが、いくつか種類がある。

  1. IPsec
  2. PPTP
  3. SSLなど。

それぞれOSI参照モデルにおけるレイヤが異なる。
IPsecであれば、対象はIPである。
これは、IPパケットに対して暗号化やトンネリングを行うということ。
IPsecによるVPNは、セキュリティゲートウェイなどと呼ばれる装置で相互にトンネルを構築することでVPN通信を可能にする。
実際には、VPNルータやファイアウォールなどがVPNの機能を持っていて、インターネットに接続しつつ、各拠点とトンネルを構築する。
IPsecでのトンネルは、LAN内のプライベートIPアドレスのパケットを、インターネット上での通信で用いるグローバルIPアドレスのパケットでカプセル化することで実現する。

これによって、「ルータ間の通信に見せかける」ということ。

PPTP(Point to Point Tunneling Protocol)は、ダイヤルアップ接続での認証を受け持つPPP(Point to Point Protocol)にトンネリングと暗号化の機能を追加したVPNプロトコル
Windowsで古くからサポートしていて、別途ソフトウェアを導入しなくとも使える。
接続先のサーバとユーザアカウントを指定すれば利用できる。
こちらはレイヤ2を対象としている。
IPsecと比べると、セキュリティレベルは低い。
カプセル化は同じ。IPじゃないけど、カプセル化して暗号つかってルータ間通信に見せているということ。

IKE


IPsecで使われる鍵生成等のプロトコル。
IPsecでは、実際のトンネルを構築する前に、VPNルータ同市が各種の設定を交換する必要がある。
そこでIKE(Internet Key Exchenge)というプロトコルを用いて、暗号や認証のパラメータを自動的に交換・更新することになる。
IKEを使うと、鍵生成に必要な情報が安全に交換され、さらに一定時間経つと自動的に更新されるのでセキュリティの強度を保つことができる。

参考


5分で絶対にわかるVPN
VPNとは?
インターネットで構築するVPNの仕組み

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.