0

ファイル転送失敗から解像度を高める

先日、バッチがこけた。まぁー運用やってればよくある話だけど。
今回は ファイル転送失敗 という1つの事象から
運用解像度(視点)を高めましょう。
ファイルの転送に失敗。。
OSコマンドであるsftpが失敗し ようだ。
非疑箇所としてNWかとおもいきや、、
javaのファイル転送ライブラリのバグが原因でした。
バッチサーバの副系で救済(正常終了)していたので
結果オーライではあるが。。。

それにしても該当時間のftp関連のログが見当たらなかたのが、なんでだったのか。。。
そんなわけで、
今回、ネットワーク越しにsshを使ったファイルを扱うコマンドを中心に
その概要、処理シーケンスなどをはっきりさせておきましょう。


sshにはちょっとした仕掛けが隠されています。そんな仕掛けを上手に使う「安全なファイル転送」を今回取り上げましょう。安全なファイル転送は、サーバ管理だけでなく、さまざまな場面で活躍するはずです。

安全なファイル転送とは

安全なファイル転送って何ですか?

ファイル転送とは、ネットワークでつながったコンピュータにファイルを送ったり、受け取ったりすることです。つまり、ファイル転送をするには、ネットワークの中をファイル本体が流れていく、ことになります。

ここで問題になるのが、盗聴、改ざん、なりすましの問題です。第三者に知られることなく、ファイルの内容そのままで、正しい相手に送り届けるためには、単に相手へファイルを送っただけではうまくいきません。

ここで取り上げる「安全なファイル転送」とは、暗号化の仕組みなどを使って、ファイルを送り届ける方法に工夫を凝らし、盗聴、改ざん、なりすましといった事故を起こすことなく、相手にファイルを送り届けることを意味しています。

安全に行うにはどうするのでしょうか?

安全なファイル転送をする方法はいろいろありますが、ここではsshの仕組みを使う方法を取り上げます。sshは3層構造になっています。
❶相手サーバや利用者が正しいことを確認
❷データは暗号化して他人に読めなくしたものを送信
❸データの一貫性も保つような仕組み

これらの仕組みはすでに準備されているので、
それを活用するだけで安全なファイル転送を実現できます。

sshとファイル転送

sshはリモートコンソールではないのですか?

リモートコンソール機能はsshの重要な機能の1つです。しかしこのほかにもsshは、「リモートマシンでのプログラム実行」機能や「サブシステムの実行」機能を備えています。これらを上手に使うと、安全なファイル転送ができます。

もう少し具体的にいうと、通信相手のコンピュータで「ファイルの内容をsshの通信路を使ってこちらに送ってくるプログラム」を実行すると、ファイル転送ができるようになります。または、ftpサーバのようなファイル転送専用のサービスを動かす方法もあります。

sshのファイル転送は1種類だけですか?

現在、sshで使われているファイル転送の方法には、scpとsftpの2種類があります。この2つの違いが意識されることは少ないようで、「どういう場合にどちらを使わなければならない」といった使い分けはあまりされないようです。

実際のところ、この2つを見て「ファイルを転送する」働きそのものには大きな違いはありません。しかし動いている仕組みは微妙に違っていて、よく見るとそれぞれ別々の特徴を持っています。

具体的には、
scpは「リモートマシンでのプログラム実行」の仕組み
sftpは「サブシステムの実行」の仕組みで動いています。

scpの特徴は?

図1はscpが動いているときのイメージを図にしたものです。
利用者がサーバにあるファイルを取り出す指定をすると、
①scpのクライアントプログラムはsshサーバに接続して、
②「『自分あてにファイルを送る』コマンドを起動しなさい」という命令を送ります。

r13scrtpro_01
図1 scpの利用イメージ

命令を受け取ったsshサーバは、シェルと呼ばれるプログラムを起動し、
そのシェルが「sshの通信路を使ってファイルを送り返す」プログラムを起動します。
これにはscpという名前のプログラムを使います。プロトコルと同じ名前が付いたプログラムです。

このscpは指定のファイルを読み出して、同じ通信路に流し込みます。するとそのデータはscpクライアントに届きます。scpクライアントはこれを保存してゆくことで、ファイル転送を実現します。

このときscpクライアントプログラムとsshサーバプログラムの間は、sshによる通信路を使っていますので、誰かに盗聴されても内容は分かりませんし、改ざんすることもできません。またsshの接続をするときに正しいサーバか、正しいユーザーかを確認しますので、なりすましも防ぐことができます。つまり、安全にファイル転送ができたことになります。

ちなみにscpのプロトコルは、rcpという暗号化機能のないファイル転送用のプロトコルがベースになっています。
これをsshの安全な通信路でやりとりすることで、安全なファイル転送を実現しています。

「UNIXスタイルのシェルで動かす」って何ですか?

シェルは、UNIX系のシステムで使われている、コマンド処理プログラムのこと。

このシェルを使うのはscpの特徴の1つです。

 

sftpの特徴は?

ではsftpはどうでしょうか? sftpが動いているときのイメージを図2に示します。

r13scrtpro_02
図2 sftpの利用イメージ

利用者がサーバにあるファイルを取り出す指定をすると、
sftpのクライアントプログラムはsshサーバに接続して、

「sftpサーバを起動して接続しない」という命令を送ります。

命令を受け取ったsshサーバは、
sftpサーバプログラムを起動して、クライアントとの間に通信路を準備します。

この後、クライアントはsftpサーバに対して、sftpのコマンドを送り、必要なファイルを取り出します。

コマンドには「ファイルを開く」「ファイルを閉じる」「ファイルを読み出す」「ファイルを書き込み」といったものがあります。

 

ファイル転送を途中で止められるsftp

scpでは、①通信路をつないだ後に、②コマンドを送るスタイルを取っていますので、1つのコマンドが終わった後に、次のコマンドを送ることができます。

そのため、ファイル転送を途中で止めたり、途中から再開したり、ファイル転送をいろいろとコントロールできる特徴があります。

sftpの場合も同様に、sftpクライアントプログラムとsshサーバプログラムの間は、sshによる通信路を使っていますので、盗聴などの心配はありません。

 

軽快さをウリにするscp、高機能をウリにするsftp

scpとsftpの違いを一目で見たいのですが

表1にscpとsftpの特徴を比較してみました。この表はWinSCPのWebページにある比較表を参照して、主要部分を抜き出して日本語化、また一部追記したものです。薄緑の背景は、一般的に考えて優れていると思われる方を表しています。

項目 scp sftp
速度 パケットの確認をしないので、速いことが多い。ただし確認しないことによる問題が発生することがある パケットの確認をするので、遅いことが多い。新しいバージョンでは改善されている
転送の再開 できない できる
大きなファイルの扱い 4GBを超えるファイルを取り扱えない 4GBを超えるファイルでも取り扱える
転送の中止 通信そのものを中断することで中止する 通信を維持したまま転送を中止できる。中止した後は、次のコマンドが送れる
ファイル名の変更 できる できる
ファイルの複製 できる できない
コマンド実行 できる できない
サーバの環境 UNIXスタイルのシェルがあることを想定している UNIXスタイルのシェルは不要
新旧でいうと…… どちらかというと古い どちらかというと新しい
特徴を一言でいうと…… シンプルで軽快 高機能だがやや重い
表1 scpとsftpの比較 (参照) http://winscp.net/eng/docs/protocols※一般的に考えて、優れていたり汎用的と思われる方の背景色を薄緑にしています。どちらも同様の機能を備える項目、またその項目が短所長所の両面を持っていて甲乙つけ難いものは両方の背景を薄緑にしています

 

発表時期はscpの方が古いのですが、特徴を比較する限りは、どちらか一方がずばぬけて優れているというわけではないようです。

人によって見方は違うかもしれませんが、一言でいうなら

軽快さをウリにするscp
高機能をウリにするsftp

といったところです。

 

興味深いのは、サーバの環境です。

scpはサーバにUNIXスタイルのシェルを備えている必要があります。

それに対してsftpはUNIXスタイルのシェルは不要です。

さまざまなOSへの対応のしやすさはsftpに軍配が上がるようです。

また大きなファイルを取り扱う必要があるときにはscpでは対応できないことも起こり得ますので注意が必要です。

 

すべてのsshサーバがscpとsftpに対応しますか?

sshサーバにはフリーで配布されているものと商品として販売されているものがあります。
フリーで配布されている代表的なsshサーバ「OpenSSH」については、scpとsftpの両方の機能を持っています。
一方、市販品のsshサーバの中には、sftpにのみ対応し、scpには対応していないものもあるので注意が必要です。

 

sshバージョン1や2との組み合わせは?

sshのプロトコルには大きく2種類(バージョン1、バージョン2)あります。
sshバージョン1はいくつか問題点が見つかり、使われない方向にありますが、まだ使われています。

scpはsshバージョン1対応のプログラムの一部として、
sftpはsshバージョン2対応のプログラムの一部として発表されました。
しかしながら、sshバージョン1とsftpを組み合わせて使うことも、sshバージョン2とscpを組み合わせて使うこともできます。

 

代表的なクライアントは?

Windowsで利用できる代表的なクライアントプログラムでは、何といっても「WinSCP」が有名
WinSCPはhttp://winscp.net/eng/docs/lang:jpからダウンロードできます。WinSCPでは、転送プロトコルとしてscp、sftpの両方に対応しています。またsshのバージョンに関しても、バージョン1と2の両方に対応します。画面1は、これらの情報登録画面で、ホスト名やユーザー名などともに、使用するプロトコルを指定しているところです。「sftpが使えないときにはscpを使う」という設定も可能です。

r13winscp-1
表1 WinSCPの設定画面

 

Linux OSコマンドsftpによる転送

■ 対向(転送)先サーバにsftp接続

sftp [USERNAME]@[IPアドレス]

■ 転送ファイル(hoge.txt)が格納されているディレクトリ(/home/users/[username]/hoge)へ移動

ftp> lcd /home/users/[username]/hoge
ftp> lls
hoge.txt

■ ファイル転送

ftp> put hogs.txt
ftp> ls
- - -
hoge.txt ←転送成功!
- - -

対話的にファイルを転送

クライアント(ユーザー:hachim.jp)からVPS(リモートマシン、IPアドレス:aaa.bbb.ccc.ddd)にファイル(tmp1.txt)を転送(put)します。

$ sftp hachim.jp@aaa.bbb.ccc.ddd ← リモートマシン:aaa.bbb.ccc.ddd に ユーザ:hachim.jp でログインします
hachim.jp@aaa.bbb.ccc.ddd's password: ← ssh認証:パスワードを入力します
Connected to aaa.bbb.ccc.ddd.
sftp> put tmp1.txt ← クライアントからリモートマシンへtmp1.txtを転送します
Uploading tmp1.txt to /home/hachim.jp/tmp1.txt
tmp1.txt 100% 26 0.0KB/s 00:00
sftp> quit ← sftpコマンドを終了します

VPS(リモートマシン:sftpserver)からクライアント(ユーザー:hachim.jp)にファイル(tmp2.txt)を取得(get)します。

$ sftp hachim.jp@sftpserver ← リモートマシン:sftpserver に ユーザ:hachim.jpでログインします
hachim.jp@sftpserver's password: ← ssh認証:パスワードを入力します
Connected to sftpserver.
sftp> get tmp2.txt ← リモートマシンからtmp2.txtを取得します
Fetching /home/hachim.jp/tmp2.txt to tmp2.txt
/home/hachim.jp/tmp2.txt 100% 25 0.0KB/s 00:00
sftp> quit ← sftpコマンドを終了します

▼sftpの対話的なコマンド一覧

bye sftpの接続を閉じます。

cd パス名 指定したパス名に移動します。

exit sftpの接続を閉じます。

get リモートマシンからローカルマシンへファイルを取得します。

help ヘルプを表示します。

lcd パス名 指定したパス名(ローカル)に移動します。

lmkdir パス名 指定したパス名のディレクトリをローカルに作成します。

lpwd ローカル側の現在作業中のディレクトリを表示します。

mkdir パス名 指定したパス名のディレクトリをリモートマシンに作成します。

put ローカルマシンからリモートマシンへファイルを転送します。

pwd リモートマシン側の現在作業中のディレクトリを表示します。

quit sftpの接続を閉じます。

 

バッチファイルでファイルを転送

バッチファイルでクライアントからVPS(リモートマシン、IPアドレス:aaa.bbb.ccc.ddd)へファイル転送します。

$ cat sftp.bat

put tmp3.txt

quit

$ sftp -b sftp.bat hachim.jp@aaa.bbb.ccc.ddd

hachim.jp@aaa.bbb.ccc.ddd's password:

sftp> put tmp3.txt

Uploading tmp3.txt to /home/hachim.jp/tmp3.txt

sftp> quit

以下のように、うまくいかない場合。

$ sftp -b sftp.bat hachim.jp@aaa.bbb.ccc.ddd

Permission denied (publickey,password).

Connection closed

-o オプションで明示的に「”batchmode no”」を指定します。

$ sftp -o "batchmode no" -b sftp.bat hachim.jp@aaa.bbb.ccc.ddd

hachim.jp@aaa.bbb.ccc.ddd's password:

sftp> put tmp3.txt

Uploading tmp3.txt to /home/hachim.jp/tmp3.txt

sftp> quit

バッチファイルをcronなどで自動化したい場合は、パスフレーズなしの公開鍵認証を利用しましょう。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です