SSH/SCP – サーバーへファイルをアップロード | [連載]短期集中Webエンジニア 第8回

SSH/SCP – サーバーへファイルをアップロード | [連載]短期集中Webエンジニア 第8回 IT技術

このシリーズは、短期間でWebエンジニアとして最低限必要な技術を学ぶことを目的としています。

前回Linuxのサーバーをインストールし、ApacheというWebサーバーをインストールするところまでを確認し、HTMLやJavaScriptの配布準備が整いました。今回は、構築したWebサーバーをブラウザから参照できる状態である事が前提となります。

Webサーバー上に配置してあるHTMLやJavaScriptをブラウザから参照することが出来るようになっても、実際にはサーバー上でファイルを作成するのではなく、自分のパソコンなどのローカル環境で製作したファイルをアップロードして使いたいものです。今回はその方法について確認していきましょう。

サーバーへファイルを転送する方法

サーバーへファイルを転送する方法はいくつかの種類があります。ここではその中から以下の2種類の方法を紹介します。

どちらの方法を選択したとしても、ローカルのファイルをサーバー上へアップロードしたり、サーバー上のファイルをローカル環境へダウンロードすることができるようになります。ただし、通信の内容や伝送方式が異なる事から、セキュリティー面で大きな違いがあります

FTP – 伝統的なファイル転送

FTPは、File Transfer Protocolの頭文字を取った通信仕様で、まさにファイルを転送するために作られた伝統的な通信方式です。Linuxだけでなく、古くはUnixやもちろんWindowsなどでも盛んに使われていて、現在でも利用しているサーバーは多いでしょう。

しかし、近年FTPの利用には否定的な意見が多いのも事実で、これにはFTPの通信仕様が影響しています。FTPは、通信の確立と実際のファイル転送で異なるポートを利用します。そのため、サーバーやネットワークのセキュリティー上の穴(通信経路)を複数開けなければならず、セキュリティー上どうしても弱くなってしまいます。また、通信内容が暗号化されないという欠点もあります。

SCP – 暗号化されたファイル転送

SCPは、Secure Copyという暗号化された安全高速なファイル転送プロトコルの事です。通信仕様のベースはSSH(Secure Shell)となっていて、FTPにも同じようにSSHをベースとして拡張したSFTPという通信仕様が作られています。

SCPはSSHの通信ポートさえ空いていれば通信/転送が行えるため、FTPよりもセキュリティー上の欠点が少ないことになります。FTPに比べるとファイル転送以外の機能が殆どないファイルコピー用のプロトコルで、拡張性もない通信仕様ではありますが、その分高速な伝送が可能です。

SSH自体は、外部のコンピューターに対してリモートでログインして操作することが可能な通信プロトコルなので、Webサーバーを始め多くのサーバーで利用されています。そのため多くの場合は、新たにファイル転送用のサーバー機能を準備する必要はなく、既存のSSHを利用する形でSCPでのファイル転送を行うことが多いでしょう。

SSHプロトコルを知ろう

SSHプロトコルとは、Secure Shellの名前の通りセキュア(安全)なシェルです。シェルというのはOSによるコマンドの受付により、対話をするシステムの事です。つまり、外部からOSに対して安全にログインして、コマンドを発行できる通信と考えてよいでしょう。

Webサーバーに限らず、Linuxのサーバーを外部から操作する際には、SSHはよく利用されます。SSHなどを利用せず、直接Linuxサーバーに接続して操作することは、「コンソール」といって区別します。コンソールという言葉は広い意味を持った日本語ですが、サーバー関連で使われる際は、サーバーへ直接ログインすることを指します。

近年ではクラウドサービスやVPSのような仮想サーバーを利用することも多くなりましたが、そういったサービスでもコンソールログイン機能が提供されていることが多く、SSHなどのリモートログイン機能がサーバーにない状態のときは、そのコンソール機能を使ってサーバーを設定していくことになります。

LinuxへSSHサービスを追加

Linuxのサーバーには、標準でSSHサービスがインストールされていることも多いですが、ここではSSHが入っていないことを想定して、インストールする方法を確認しておきます。

SSHのインストールには、Linuxのパッケージマネージャを利用すると簡単です。

# CentOS(Red Hat系)の場合
yum install openssh-server

# Ubuntu (Debian系)の場合
apt install openssh-server

OpenSSHのLinux上のサービス名はsshdなので、Linux上でSSHに対して様々な設定(IP制限など)を行う場合には、sshdに対して行うことになります。

sshdの起動・停止・再起動設定

インストール後に、サービスの状態を変更する場合、systemctlコマンドで行います。コマンド名に続いて「実行するアクション」「サービス名」と続けます。

実行したいアクションコマンド指定
開始start
停止stop
再起動restart
systemctlコマンドのアクション

実行には管理権限が必要になります。rootに昇格するかsudoを使いましょう。

CentOS(Red Hat系)の場合
systemctl start sshd
systemctl stop sshd
systemctl restart sshd

正確には[sshd.service]ですが、[.service]は省略して以下のように指定可能です。

Ubuntu(Debian系)の場合
systemctl start ssh
systemctl stop ssh
systemctl restart ssh

sshdの代わりにsshを指定することができます。

SSHのポートは22番 – ファイアウォールの設定

Webサーバー(Apache等)と同様に、sshdをインストールしただけではファイアウォールに阻まれてサーバーへ接続できない可能性があります。ファイアウォールに穴をあけるには、その通信が使用しているポート番号を知っておく必要があります。

SSHのポート番号は標準では22番です。22番のポートを開けるには以下のようにします。

# CentOS (Red Hat系)
firewall-cmd --add-port=22/tcp --zone=public --permanent
firewall-cmd --reload

# Ubuntu (Debian系)
ufw allow 22

ファイアウォールの設定はRed Hat系とDebian系で異なるので、注意しましょう。

SSHを使ってリモートログインする

サーバーにSSHサーバー(sshd)をインストールして起動したら、クライアントから接続して動作を確認しましょう。

SSHの接続の基本はコマンドから行います。WindowsやMac、Linuxのターミナル(コマンドプロンプト)からsshコマンドを実行し、オプションに接続先を指定して接続します。

個人的には毎回同じコマンドを入力するのも面倒なので昔からツールを利用していますので、そちらも合わせて紹介しておきます。実行するクライアント環境や自分の作業などを踏まえてツールの利用については検討してみてください。

私が利用しているSSHのWindows用のツールは「PuTTY」です。古くはTeraTermなども利用していたこともありますが、もう10年以上PuTTYを利用しています。もうソフト自体更新されてなさそうで、これから新規で利用する人には正直あまりオススメはしませんが、便利ではあります。

[PuTTY公式サイト]
https://www.chiark.greenend.org.uk/~sgtatham/putty

一度登録した接続先の情報や、画面色設定などが保存されることを利用して、開発用のサーバーと本番用のサーバーの色を変えておいて、間違えて本番に危ないコマンドを実行されるといった人為的なミスを防ぐといったことも可能なため、IT現場では作業効率と安全性の面からツールの利用を徹底していました。

SCPの便利なツール

SSHサーバーの準備が整ったら、ファイルを転送(SCP)も同時に可能になっているので試してみましょう。

SSH接続と同じように、SCPにも便利なツールが色々とありますが、ここでは私が古くから利用している無料のWindows用アプリケーションで有名なWinSCPを紹介します。

WinSCP ダウンロード(窓の杜)

WinSCP 公式サイト

WinSCP

上の画像のように、左に自分のパソコン側のフォルダ、右にサーバー側のディレクトリが表示されていて、エクスプローラーのようにドラッグアンドドロップ操作によってファイルのアップロード・ダウンロードが可能な便利なツールです。2024年現在もバグ修正など細かなアップデートが行われている本当に素晴らしいソフトウェアです。

Linuxのファイル権限について知ろう

SCPなどを使ってLinuxのサーバーにファイルをアップロードすると、サーバー上にローカル側と同じファイルが作成されますが、作成されたファイルの権限については注意が必要です。

WindowsでもLinuxと似た様なファイルの所有者やアクセス制御などが機能としては備わっていますが、個人利用が前提としてあるWindowsと複数ユーザー利用が前提のLinuxでは、ファイルに対する扱いが大きく異なります。

ファイルの所有権やアクセス制御の情報の事を、LinuxではPermission(パーミッション)と呼びます。権限が不足して、ファイルに対しての操作が行えない場合には、Linuxは[Permission Denied](許可がない)というエラーを吐きます。

Permission(パーミッション)の確認方法と意味

LinuxのPermissionは、ファイルやディレクトリが持っている情報なので、lsのようなディレクトリを参照するコマンドから状態を確認することができます。以下に例を示しながら紹介します。

以下は、devuserというユーザーでログインして、Homeディレクトリでls -laというファイル一覧を得るコマンドを実行した結果の抜粋です。

$ ls -la
drwx------.  8 devuser devuser   4096  7月  7 14:42 .
drwxr-xr-x.  3 root    root        21  5月 14 03:09 ..
-rw-r--r--.  1 devuser devuser    231 11月 25  2021 .bashrc
drwxrwxr-x.  3 devuser devuser     23  6月  7 16:45 .cache

この実行結果で着目すべきなのは左端の文字の羅列と中央付近にあるユーザー名のような部分です。

ファイルのPermission – lsコマンドに表示される権限情報

lsコマンドの例にある左端の計10文字からなる文字の羅列は以下のような意味になっています。

種別(1)所有者(3)所属グループ(3)その他(3)
– : ファイル
d : ディレクトリ
l : シンボリックリンク
r : 読込
w : 書込
x : 実行
– : 権限なし
r : 読込
w : 書込
x : 実行
– : 権限なし
r : 読込
w : 書込
x : 実行
– : 権限なし
パーミッションの内訳

種別を除いた9文字の権限部分は、数値で表現されることもあります。文字で表現された情報は、人間が読む場合には理解しやすくて便利なのですが、コマンドなどで指定する場合などは冗長で指定が面倒なこともあり、数値指定がよく使われます。

数値で表す場合は、それぞれ許可(1) or 禁止(0)を並べた2進数か、2進数を3桁でまとめた8進数で表されます。

例えば上記lsコマンドの結果にある.bashrcのパーミッションは[rw-r–r–]となっていて、それは2進数では以下のように表現することが可能です。許可の部分が1で、禁止(-)となっている部分に0が入っています。

rwxrwxrwx
110100100
パーミッション(2進数)
2進数を8進数に変換する計算

2進数3桁を8進数に変換するには、計算が必要になります。

パーミッションの2進数の場合は、計算は各グループの3桁ごとに行います。各桁に対して、下の桁から1,2,4の数値をそれぞれ掛け算し、結果を足し合わせます。2進数が0の場合は0、1の場合は1,2,4のどれかの数字になって、全部が1の場合は1+2+4の7になります。0のパターンを含めると、全部で0から7の8パターン(8進数)が表現できていることが分かります。

421
パーミッション(2進数 – 8進数計算)

文字での説明だけでは分かりにくいので、2進数から8進数の計算の全パターンを下に列挙しておきます。覚えるのではなく、計算のイメージを掴んで、自身で計算できるようになっておくと便利です。

2進数計算8進数
0000 + 0 + 00
0010 + 0 + 11
0100 + 2 + 02
0110 + 2 + 13
1004 + 0 + 04
1014 + 0 + 15
1104 + 2 + 06
1114 + 2 + 17
2進数から8進数の計算パターン (パーミッション)

この計算を3つのグループ(所有者・所属グループ・その他)それぞれに行い、できあがった8進数の数字をならべて3桁にして扱います。

[rw-]の場合は、[4+2+0]で6となり、[r–]の場合は[4+0+0]で4となります。つまり、[rw-r–r–]は2進数で[110 100 100]であり、8進数で[644]ということになります。

Permissionの変更 – chmodコマンド

ファイルの権限を変更するにはchmodコマンドを利用します。

#chmod 764 .bashrc

上記のように、chmodコマンドに続いて、新しいファイル権限(8進数)と対象のファイル名を指定します。8進数3桁での指定をする方法が広く利用されていて、見た目でどのような状態にするコマンドなのか一目でわかりやすくてオススメです。以下にサーバー管理でよく利用される、頻出のアクセス権について表にしておきます。

アクセス権意味合い
777フルアクセス
744自分はフルアクセス
他は読込のみ
755自分はフルアクセス
他は読込・実行のみ(書き込み禁止)
頻出パーミッション

アクセス権限については、分かりやすい文字で指定することも可能です。その場合、ユーザーに対してだけ読み込み権限を付与するといった、個別のアクセスだけを修正することも可能となります。こちらの方がコマンドから直感的に分かりやすいと感じる人もいるようなので、最終的には個人の自由ではありますが、どちらも理解できるようになっておくとよいでしょう。

#chmod g+w .bashrc

上記はGroup(グループ)に対してWrite(書き込み)の権限を付与(+)する例となっています。

所有者の変更 – chownコマンド

ファイルの所有者の変更は、Webエンジニアにとって重要です。アップロードしたファイルは接続に利用したユーザーに所有権があり、一般的にWebサーバーは異なるユーザーで実行されているからです。つまり、アップロードしただけではWebサイトの表示に利用できない状態ということがよくあるのです。

ファイルの所有者を変更するにはchownコマンドを利用します。

#chown www-data:www-data index.html

上記例では、index.htmlというファイルの所有者および所有グループをwww-dataに変更しています。このように、chownコマンドはユーザーグループを一括で変更することができて便利です。www-dataというのは、Debian系で利用されるApache2の実行ユーザーです。Red Hat系のhttpdではapacheというユーザーになります。

Debian系とRed Hat系という2つのLinux Distributionの違いに興味のある方は、以下の記事などもご覧ください。

ディレクトリに含まれた複数のファイルを全部丸ごと特定のユーザーとグループに所有権を変更する場合は、以下のようにオプション指定します。-Rを指定すると、Recursive(再帰的)に全部のファイル/ディレクトリを走査しながら所有権変更を行ってくれます。

#chown -R www-data:www-data /var/www/html

サーバー上のファイル操作の基本コマンド

最後に、Linux上でのファイル操作方法について、簡単に紹介しておきます。

ファイルアップロードを直接サーバーのドキュメントルート以下に行うのはセキュリティー上危険なため、多くの場合は一度Homeディレクトリなどの権限の弱いディレクトリにアップロードした後で、Web公開されているディレクトリ以下へコピーするといった操作が行われることが多いでしょう。

ここでは基本的なLinuxのファイル操作について、最低限覚えておいた方が良いコマンドを簡単に紹介します。

ファイルのコピー – cpコマンド

ファイルのコピーはcpコマンドを利用します。

#cp index.html index2.html

#cp -R /home/devuser/html /var/www/html

バックアップを取るためなどに、ファイル名を変更してコピーをするといった使われ方をする他、アップロードしたホームディレクトリのファイルを、ドキュメントルートに一括して上書きコピーするといった使われ方もします。-Rのオプションは、chownと同様にRecursive(再帰的)コピーで、ディレクトリの中身の形をそのままコピーしてくれます。

ファイルの移動 – mvコマンド

ファイルの移動はmvコマンドを利用します。

#mv index.html index.html.backup

ファイルを別のディレクトリに移動する他、ファイル名の変更として上記のように利用することもあるコマンドです。ファイルを一時的に退避しておいたり、圧縮解凍を終えた元のアーカイブファイルを別の場所に移動するなど、利用用途の多いコマンドです。

ファイルの削除 – rmコマンド

ファイルの削除はrmコマンドを利用します。

#rm index.html.backup

不要となったファイルを削除する必要がある場合はこのコマンドで消すことができますが、消えたファイルは戻ってこないので、実行する場合は十分に注意しましょう。

ディレクトリの作成と削除 – mkdir, rmdirコマンド

Linux上でディレクトリを作成する場合は、mkdirコマンドを利用し、削除する場合はrmdirコマンドを利用します。

#mkdir backup

#rmdir backup

作成・削除するディレクトリ名を指定します。削除を指定するディレクトリは、中身が完全に空っぽになっている必要があります

$ rmdir backup
rmdir: `backup' を削除できません: ディレクトリは空ではありません

中身が入っているディレクトリの強制削除 – rm -Rオプション

中身も丸ごと削除したい場合は、ファイルの削除で使用したrmコマンドを利用して、以下のように再帰処理(-R)のオプションを指定します。rmdirではなく、rmコマンドなので間違えないようにしましょう。

#rm -R backup

指定したディレクトリ以下が丸ごと消えてしまうので、実行には細心の注意を払いましょう。できれば間違いがないように、絶対パスの形式で指定することを心がけ、実行前には中身を再度確認しておきましょう。

世界にWebコンテンツを提供できる技術者へ

今回の学習を経て、サーバーにHTMLやJavaScriptなどのWebコンテンツをアップロードして公開することができるようになりました。

LinuxやWebサーバーの技術分野は、複数の技術分野が複雑に絡み合っていて、複合的な知識が要求される世界です。そのため、一朝一夕に習得するということは難しく、仕事においては何よりも経験が重視されることが多いです。特に不測の事態に陥った際にその問題を解決したり、安定してサービスを提供し続けたといった実績は、IT業界内外問わず、高い評価を得ることになります。

Webエンジニアとしてクライアント・サーバーどちらの方向性に進んでいくことになったとしても、今回紹介したような最低限のサーバー構築技術を知っておくことは、とても重要で役に立ちます。Webエンジニアにとっては、「車は道路を走るもの」と同じくらい「Webはネットワーク通信で実現されるもの」という意識は大事です。走る道がなければ車は価値がありません。しっかりサーバーやネットワークについても理解して、「なければ作る」技術力を習得しておきましょう。

Webサーバーがあれば、クライアントサイドだけでは実現が難しいような複雑なサービス(ECサイトや検索サイトなど)を提供することも可能になります。Webエンジニアの高みを目指すのであれば、どんどん興味を持っていきましょう。

コメント