A Day In The Boy's Life -106ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

最近、FTPを通してサイト改ざんの被害なんかが広まっていますが、そもそもインターネット越しにFTPは使うなというのは自論としてあるんですが、設定を少し見直すだけでFTPのセキュリティも多少改善されたりします。

その設定方法や運用上のTipsを幾つか書いてみたいと思います。

なお、ここではLinux系のでの設定方法を書いていますので、WindowsでのFTPサーバーの設定ではできないやり方も含まれています。



ネットワークlによる接続制限


まずは、FTPへ接続できるN/Wをそもそも制御してしまいましょう、というやり方です。

N/W機器によって制限するやり方ももちろんありますが、ここではFTPデーモン側でどうにかする方法を。


tcp_wrapperに対応しているサーバーであれば、「/etc/hosts.allow」に


vsftpd:192.168.0.0/255.255.0.0

※ vsftpdを使っている場合


のような書き方をすれば、特定のN/WにあるPCからしか接続できなくなります。

また、proftpdでは設定ファイル(proftpd.conf)に、


    <Limit LOGIN>
        Order Allow,Deny
        Allow from 192.168., 127.0.0.1
        Deny from all
    </Limit>

のように書きます。

これは、あまり広い範囲でN/Wアドレスを指定していては意味がありません。

管理用のPCが決まっているのであれば、その固定IPを幾つか設定しておくようにしましょう。



接続するユーザー名での制限


一部のFTPデーモンでは、接続するユーザーを制御したり、FTP専用のユーザーを作ることができたりします。

例えば、proftpdでは


    <Limit LOGIN>
        Order Allow,Deny
        AllowUser workuser
        Deny from all
    </Limit>

のように書くことで、「workuser」のみFTP接続を許可するということができます。

また、FTPユーザーがOSのユーザーとなっている場合、FTP接続用のIDとパスワードが漏れればサーバーへもログイン可能という状態に陥ったりします。

それを回避するために、FTP専用のユーザーやバーチャルユーザーを作ることもできたりします。


参考: OS上にいないバーチャルユーザーを使ってFTP接続する



データ転送用ポートの変更


FTPにはアクティブモードとパッシブモードの2つ通信方法があります。

パッシブモードの場合、任意のデータ転送用ポートがサーバーから指定されるため、毎回接続ポートがことなってきます。

一方で、アクティブモードはよく知られた20番ポートをデフォルトで使います。


こう見ると接続ポートが推測されにくいパッシブモードの方がセキュリティ的に高くなるわけですが、FireWallをはさむ環境の場合、パッシブモードでのデータ転送ができない場合もあります。

理由は、F/Wでは通信を許可するポートを絞っているため、任意のポートを開いて通信するというようなことができないためです。

ただ、いづれの場合でもデータ転送用のポートを固定することは可能です。


参考: FTPのアクティブモードとパッシブモード + vsftpdでの設定方法


通常のFTP通信とは異なるポートを利用することで、データ転送自体を少しだけ安全にすることができます。



転送用ディレクトリと転送ファイルの制限


多くのFTPデーモンでは、FTP接続時のルートディレクトリを指定することができます。

ルートディレクトリを指定していれば、それより上位のディレクトリには移動できません。
これは場合によっては、不便ですがFTP接続できればあらゆるディレクトリに移動でき、ファイルを取得・転送できるという状況に陥るよりはだいぶましです。


本当にFTPできる作業用ディレクトリに限定させることで、被害を最小限にとどめることもできます。

例えば、HTMLファイルを直接書き換えられるようにドキュメントルートとFTPルートディレクトリを同じにせず、FTP転送用ディレクトリにファイルを一旦転送させ、その後SSHなどでサーバーにログインして作業することで、直接的にコンテンツを改ざんされるというような状況は少なくなります。

また、FTPデーモンによっては転送できるファイルを制限することもできたりします。


参考: [vsftpd] 特定の拡張子のファイルのアップロードを禁止する



転送ログを見る


FTPのログをきちんと残しておくことで、どこから何のファイルが転送されたかを確認することができます。

これを定期的にチェックすることで、予定していない操作がされていないかをチェックすることができます。

Linuxの場合、FTPの転送ログは下記に保存されたりします。


/var/log/xferlog

そのまま見るのは、かなり骨が折れますがLogwatchなどログを整形してくれるツールを使えばチェックしやすくなるでしょう。


--------------------- ftpd-xferlog Begin ------------------------ 
TOTAL KB OUT: 558KB (0MB)
TOTAL KB IN: 558KB (0MB)

Incoming User FTP Transfers: hoge -> /home/foo/scripts.tar.gz (User: foo) Outgoing User FTP Transfers: /home/foo/images.tar.gz -> hoge (User: foo) ---------------------- ftpd-xferlog End -------------------------


上記の場合、期間中のファイル転送量や、どのユーザーが(上記の場合foo)どのファイルをダウンロードしたのか、アップロードしたのかということがわかったりします。


参考: Logwatchでサーバー上のログを集約する



まとめ


結論としては、最初に書いたようにインターネット越しでファイル転送する場合はFTPを使うない方が無難です。

ここにあげた設定は、少しは有効に働くかもしれませんが、それほど効果は大きくありません。

パスワードを含め、転送データが暗号化されませんので、転送途中で傍受される恐れもあります。

ファイル転送をしたい場合は、SCPやSFTPなどを使うほうが良いでしょう。

これであれば、通信が暗号化される上に、IDとパスワードを用いない公開鍵認証も使えます。


参考: [SSH] 公開鍵認証方式で接続する





2010.11.28 追記

新しくなった、はてなブックマークボタンの設置方法は、「Amebloに貼り付けていた、はてなブックマークボタンを更新してみたよ 」にまとめています。そちらもあわせてどうぞ。



前回「Amebaで、はてなブックマークボタン配置するためのブログパーツ書いたよ 」で、このAmebloにはてなブックマーク登録ボタンと、はてブ数を表示するためのJavaScriptを書いてみましたが、「最近の記事一覧 」の方にも表示できそうなので改良してみました。


※ 前回同様にはてブがついていない記事には、登録ユーザー数は表示されません。



改良版ブログパーツ用のJavaScript


前回同様に、特に貼り付けるにあたってカスタマイズしなくても問題ありません。


<script>
  $(document).ready(function(){
    var page_url = location.href;
    if (page_url.match(/^.+\/entrylist[\-0-9]*\.html$/g )) {
      var entries = $(".newentrytitle a");
      var classname = ".updatetime";
    } else {
      var entries = $(".foot a:contains('記事URL')");
      var classname = "div.entry .theme";
    }
    for (i = 0; i < entries.length; i++) {
      var url = entries[i];
      var hatena_btn = '<a href="http://b.hatena.ne.jp/append?' + url + '" target="blank"><img height="12" width="16" border="0" alt="はてなブックマークに追加" src="http://b.hatena.ne.jp/images/append.gif " /></a> <a href="http://b.hatena.ne.jp/entry/' + url + '" target="blank"><img border="0" src="http://b.hatena.ne.jp/entry/image/' + url + '" /></a>';
      $(classname).eq(i).append('  <span>' + hatena_btn + '</span>');
    }
  })
</script>


簡単に解説すると、最初にページのURL(page_url)を取得して、それが最近の記事一覧(URLがentrylist.htmlまたはentrylist-X.html ※ Xは数字)のものかを識別しています。

次にそのページ内の記事のパーマネントリンクが書かれたアンカータグから、URLを取り出し後は出力したい位置にはてなブックマークボタンと登録ユーザー数のイメージを出力しています。


最近の記事一覧のページには、はてなブックマークボタンは要らないかなと思いましたが、AmebloのJavaScriptを貼り付けられるフリープラグインが3800文字以内という制限があるため、ソースを簡略化するために同じ処理にしました。


Amebaで、はてなブックマークボタン配置するためのブログパーツ書いたよ 」に書いたように、出力位置を変えたい場合は、変えたい位置のクラス名を「classname」変数内に指定すれば位置を変更することもできます。

利用に際しては、特に制限ないのでご自由にどうぞ!


2010.02.25追記

Amebaで任意の位置に自動でタグを挿入するブログパーツ書いたよ 」に書いたように、AmebaではjQueryがデフォルトで利用可能なので、GoogleにホストされているjQueryを読み込む必要はありません。





2011.01.07 追記

ブログパーツの最新版は、「Amebaに「なうで紹介」と「mixiチェック」ボタンを追加してみたよ 」のエントリを参照してください。


この記事のテーマのすぐ横に、が表示されているかと思いますが、このようにアメーバブログで記事ごとにはてなブックマークへ登録するボタンと登録数を表示するブログパーツを書いてみました。

記事ごとに自動的に表示されるので、エントリごとにタグを埋めたりする必要はありません。


このブログパーツは、自由に利用したりカスタマイズしていただいてかまいません。

ただし、設置やカスタマイズするに当たっては自己責任でお願いします。



Amebloにはてブの登録ボタンを配置するJavaScript


書き方は、下記のような感じ。

特に、自分のブログに貼り付ける際にカスタマイズする必要はありません


<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery", "1.3");</script>
<script>
  $(document).ready(function(){
    var entries = $(".foot a:contains('記事URL')");
    for (i = 0; i < entries.length; i++) {
      var url = entries[i];
      var hatena_btn = '<a href="http://b.hatena.ne.jp/append?' + url + '" target="blank"><img height="12" width="16" border="0" alt="はてなブックマークに追加" src="http://b.hatena.ne.jp/images/append.gif " /></a> <a href="http://b.hatena.ne.jp/entry/' + url + '" target="blank"><img border="0" src="http://b.hatena.ne.jp/entry/image/' + url + '" /></a>';
      $(".theme", "div.entry").eq(i).append('  <span>' + hatena_btn + '</span>');
    }
  })
</script>

記事ごとに、ブックマークボタンとその記事のブックマーク数(ただし、1User以上登録されてないと表示されない)が表示されます。


上記のJavaScriptを「フリープラグイン」の箇所(「ブログを書く」>「サイドバーの設定」>「フリープラグイン」の編集)に貼り付ければ利用できます。



はてなブックマークボタン設置用ブログパーツの解説


とりあえず簡単な解説を。

ブログパーツ自体は、jQueryを利用して書いています。

昔、AmebaではjQueryがそのまま使えてた記憶があるんですが、ソースを見てたらどうも読まれて内容なので、GoogleにホストされているjQueryを使ってみました。


- GoogleでホストされているjQueryを利用する

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery", "1.3");</script>


次に、記事ごとのパーマネント(固定)リンクを取り出しています。

これは、記事のフッターに付いている「記事URL」というリンクにあるので、その数を取り出して、その数だけループしてその記事のブックマークボタンを設置しています。


- 記事のパーマネントリンクを取り出し

var entries = $(".foot a:contains('記事URL')");


最後に、はてなブックマーク用のボタンを用意しつつ、各記事のテーマの位置に、そのボタンのHTMLを追加していっています。


- 記事ごとにはてなブックマークボタンを追加
$(".theme", "div.entry").eq(i).append('&nbsp;&nbsp;<span>' + hatena_btn + '</span>');


ブログパーツをカスタマイズする


今回のブログパーツは、各記事のテーマの横にボタンを配置するものですが、この位置が気に入らない場合は、別の位置にも配置可能です。

編集箇所は、下記の位置のコードを別のものに置き換えてください。

$(".theme", "div.entry").eq(i).append('&nbsp;&nbsp;<span>' + hatena_btn + '</span>');

$(".date", "div.entry").eq(i).append('&nbsp;&nbsp;<span>' + hatena_btn + '</span>');


$("h3.title", "div.entry").eq(i).append('&nbsp;&nbsp;<span>' + hatena_btn + '</span>');

$(".foot", "div.entry").eq(i).append('&nbsp;&nbsp;<span>' + hatena_btn + '</span>');


2010.07.05 追記

フッターに付けるためのスクリプトに誤りがあったため修正しました。


ブログ生活がより楽しいものになれば幸いです!