Proxyとは何か

ときは1990年代後半。
インターネットといえば家の電話線を使って54kbps以下でした。
スマホ使いすぎて規制されたときの通信スピードの半分以下)


確かに当時は動画とか流行ってなかったので、私はそこまで遅いと感じてませんでしたが、少しでも早くするためにProxy(プロキシー)というサーバをプロバイダ(ISP)が用意することが多かったです。(PC側はInternetExplorerなどブラウザで設定)

 

f:id:seireinetwork:20180820212320p:plain

ProxyServerはPC1からサイトAをみたいと言われたときにサイトAのコピー(キャッシュと呼びます)を保存しておき、
あとでPC2から同じサイトAを見たいと言われた場合にはサイトAにアクセスせずにコピーを返事することでPC2のサイトA閲覧スピード向上に貢献します。

*難しい話:インターネットは何回も通信を往復する仕様となっていることから、回線が早いProxyServerがサイトをダウンロードしながら、PCに通信することは往復の空白時間が短縮される点でも高速化できることが多く、PCは同じスピードの回線でもProxyServerを経由した方が早いことがあるため前述のPC2の閲覧スピード向上だけでなく1回目のアクセスであるPC1も閲覧スピード向上が見込まれます。

 

2001年から急激に流行したADSLでは、電話線を使いつつ1Mbps程度は当たり前になり
スマホで規制されたときの10倍程度)
ProxyServerを使うことによってProxyServerに自分の情報が残る点での情報漏洩やProxyServerがメンテナンス中にサイトが閲覧できない、
Proxyの設定が面倒などの問題の方が大きく感じられるようになり今ではProxyのことを知らない人の方が多い時代になりました。

 

企業でのProxy

f:id:seireinetwork:20180821083919p:plain
一方、企業では企業のPCを使った「ゲームサイトのアクセス禁止」「DropboxGmailなど情報を持ち出せるサイトを禁止」したいと考えたとき、
企業内のPC全てに都度禁止するアドレスを設定をするよりもProxyServerで設定する方が即時反映ができることや、キャッシュで回線の負荷(回線代)を下げるなど多数のメリットからProxyServerを構築し、企業内のPCはProxyServer経由しなければ社外のWebサイトが見れないように設計されていることが多いです。

ProxyServerのシステムとURLリスト(サイトのカテゴリ化したもの)は100ユーザで年50万円、2000ユーザで年200万円程度の商品がほとんどですが、国内ベンダーの製品にはリストに追加するペースが明らかに間に合っていない製品もあります。

また、SSLHTTPSTLS)暗号化されているサイトが一般的になってきた今、設計変更を嫌う日本の大手企業ではHTTPSについてURLリスト(厳密にはドメイン)でしか判別できておらず、
ファイル送信・アップロード規制ができていないパターンがほとんどです。

 

HTTPS通信は暗号化されているため、閲覧・ダウンロードなのかアップロードなのか、ドメイン以降のアドレスすらそのままでは判別できません。
 ProxyServerで一旦復号し、再度暗号化するような設定をすればHTTPS通信の中身が判別できるようになりアップロードのみ規制できます。
 ただし、PCから見ると暗号化されていなければいけないサイトのデータをProxyServerの名前で暗号化されなおしていることは普通に考えれば情報が抜かれている攻撃を受けていることになるためエラーになります。
 回避策はありますが特に大手企業ではPC全体に回避策を施す自信がなく、現行業務影響を気にするがあまり実施できていないことがほとんどです。
 (情報漏洩など起こった際には現行業務どころではなくなるのですが)
 「その情報は当社からの漏洩ではない」ことを証明するためにもProxyServerでの通信記録を徹底すべく、ProxyServerでの復号も前向きに検討すべきだと思います。

IoTやアラート用に使える年8ドル、着信向けのSIM

「年間」8ドル(初期費用39ドル)でSoftbankの電話番号もらえるやつ。
So-netの0SIMとかは知られてるけれど、電話番号用のSIMがあまり知られてなさそうだったので紹介。

 

弊社ではセキュリティインシデントとかの緊急呼び出し用に社員の自宅置きで使ってます。着信だけならお金かからないので年間8ドルはうまい。

WiFiでアプリ呼び出しでもいいような気もするけど、
 やっぱり電話番号あった方がいい事も多いはず)

 

www.hanacell.com

コインロッカーとかで着信した電話番号を鍵代わりにするとか見かけたことあるけどそういうのにも使えそう。

(一瞬でもパケット通信するとパケ放題代みたいな金額取られるのだけ注意)

 

SuicaやEdyを鍵にした電子錠を2万円くらいで作る(C#)

AkerunProを本気で検討していたのですがコスパが当社には合わなかったので自作することにしました。
でも画面とか用意されていたりする点でも、AkerunProの方がおすすめです。ちょっとこういう方法もあるんだくらいのIoTネタとして見てください。

 

【したいこと】

社員が持ってるICOCAPiTaPaおサイフケータイ(ようはスマホとか)で事務所の出入り口を開錠できるようにしたい。

リモートで入退室ログの確認や、カードを忘れた社員から電話があればリモートで開錠してあげれたりしたい。

今ここまでつくった↓

f:id:seireinetwork:20180403223926p:plain

 

【買ったもの】

電気錠:KKmoon  片ドア 電磁式電気錠 12V 180KG (2200円)

https://www.amazon.co.jp/gp/product/B01644X458/
*180キロまで耐えられる磁石。安い。

 

USBリレーモジュール:WINGONEER LCUS - タイプ1 (1300円)
https://www.amazon.co.jp/gp/product/B071S7P5M9
Windowsから(別にLinuxでもいけそうだけど)電気の遮断・通電を制御するためのもの。


パソリ:SONY 非接触 ICカードリーダ/ライタ USB RC-S330(2500円)
*私はもとから持っていたのでS330にしました
https://www.amazon.co.jp/gp/offer-listing/B001MVPD8U
*鍵としてICカード固有のデータ(シリアルっぽいもの)を読み取るために

 

中古のパソコン:ノートパソコンは古過ぎるだとつけっぱなしで発火とか事故も怖いので私はデスクトップ派。USBリレーモジュールはきっとLinux対応してくれているので、Linuxでプログラミングできるような人ならRaspberryPiとかでいいかも。

UPS:BE425M-JP APC ES 425VA(6500円)←Amazonちょっと高かったhttps://www.amazon.co.jp/dp/B01MY53XVO
*ノートパソコンとかのDC12V対応モバイルバッテリーも候補にしていましたが、デスクトップPCの給電もしたかったのと、DC12Vモバイルバッテリーの耐久性についてそれっぽい情報がないので。

 

DC12VのACアダプター(900円)
https://www.amazon.co.jp/dp/B06XSXTLLM
*電子錠に電気送る用

 

DC変換アダプタ(100円)
https://www.amazon.co.jp/dp/B00MG97JDO
*ACアダプタのプラグと電子錠から出てるケーブルをつなげるため。小さいドライバが必要なので無かったら買う。

 

【持ってる人はいらないけれど、買ったもの】

エーモン 細線用電工ペンチ 全長約160mm(1200円)https://www.amazon.co.jp/gp/product/B00366BYAA
*配線剥く用

 

エーモン 配線コード 0,5sq 20m 黒(600円)
https://www.amazon.co.jp/gp/product/B00EXGSMLG
*電子錠から出てるケーブル短いので延長用

 

エーモン 防水収縮チューブ 4φ 140mm・4本入(200円)
https://www.amazon.co.jp/gp/product/B001JBYGHC
*配線コードをつなげる用。まだ使ってないけどこれでいいと思う

【とりあえず配線】

b接点(通常施錠)にしたいので、USBリレーのNCとCOMに電子錠のケーブル片方とアダプタのケーブル片方を配線する。余ったケーブル同士をつなぐ。ぶっちゃけ写真の通りで、線をねじるだけでも動作確認はできる。

 

【とりあえずコード(C#)】

SerialPort1.PortName = "COM4";
SerialPort1.BaudRate = 9600;
SerialPort1.Parity = System.IO.Ports.Parity.None;
SerialPort1.DataBits = 8;
SerialPort1.StopBits = System.IO.Ports.StopBits.One;
SerialPort1.Handshake = System.IO.Ports.Handshake.None;
SerialPort1.RtsEnable = true;
SerialPort1.Open();

//ずっとFelica確認しとく
while (true){ 
try{
using (Felica felica = new Felica()){

felica.Polling(0xFFFF);
byte data = felica.IDm();
String id = "";
for (int i = 0; i < data.Length; i++){
id += data[i].ToString("X2");
}
//MessageBox.Show(id); 登録用にID(ICカードのシリアルっぽいの)表示したいとき。
if (id == "0110AACCDDEEFF00"){ //このIDだったらあける。
   開ける();
   System.Threading.Thread.Sleep(3000); //3秒後に施錠
   閉める();
}
System.Threading.Thread.Sleep(500);
}
}
catch (Exception ex){
Console.Error.WriteLine(ex.Message);
}
}

private void 開ける(){
if ((SerialPort1.IsOpen == true)){
byte bytesOnCommand = new byte { 0xa0, 0x01, 0x01, 0xa2 };
SerialPort1.Write(bytesOnCommand, 0, bytesOnCommand.Length);
}else{
MessageBox.Show("SerialPort is not open.");}
}

private void 閉める(){
if ((SerialPort1.IsOpen == true)){
byte bytesOnCommand = new byte[] { 0xa0, 0x01, 0x00, 0xa1 };
SerialPort1.Write(bytesOnCommand, 0, bytesOnCommand.Length);
}else{
MessageBox.Show("SerialPort is not open.");
}
}

SSHでVPNっぽいことできるという話

あまり知られていないようだったので。

以下のような構成で赤い矢印のファイアウォールを開けれないとき(社内の申請面倒だとか、セキュリティ的にもProxyサーバへの通信が開きっぱなしにしたくないとか)に、青の矢印で通信をさせる。

f:id:seireinetwork:20180223222341p:plain

TeraTermだと

1.「設定」→「SSH転送」をクリック

f:id:seireinetwork:20180223223520p:plain

2.「追加」をクリック

3.「リモート」 にチェックをつけ、
 「8812(サーバAが使っていないポート番号なら何でも)」を入力、
 to local mechine→「192.111.111.111(ProxyサーバIPアドレス)」
 port→「8080(Proxyサーバのポート)」
 と入力し、「OK」をクリック

f:id:seireinetwork:20180223223701p:plain

4.元の画面に戻ったら「OK」をクリック
5.「設定」→「設定の保存」をクリック

f:id:seireinetwork:20180223223755p:plain

6.そのまま「保存」をクリック

f:id:seireinetwork:20180223223849p:plain

7.「ファイル」→「新しい接続」でサーバAに接続するか、
  すでに接続している場合は「ファイル」→「セッションの複製」をする。

8.export http_proxy=http://localhost:8812/
  とすることで青矢印の通信経路でProxyサーバに行くことになる。
  *認証情報が必要なProxyの場合は
  export http_proxy=http://userid:password@localhost:8812/
  とすることで、URLにユーザID(これだとuserid)と
  パスワード(これだとpassword)を埋めることができる。

9.あとはyum check-updateでもwgetでも。

 

CentOSやUbuntuServerではこの通信手段が標準で許可されており、
設定を逆(?)にすることで、以下のような使い方も可能となる。

f:id:seireinetwork:20180223224244p:plainもともとサーバAと他のサーバ間にファイアウォールがないことに問題があるが、
サーバAの保守委託先にはサーバAしかアクセスできないようにしているつもりがどのサーバへもアクセスできてしまう事に気づいていない方が多い。

切っておきたい場合は
/etc/ssh/sshd_config
 AllowTcpForwarding No


*そんなことよりサーバAから他のサーバへ行かせないようにするべき…

nginxで変なポートでもSSL強制したい

400 Bad Request

The plain HTTP request was sent to HTTPS port

とか出るとき。
ブラウザで毎回https://って打ち直すのが面倒。

server{
port 8888;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
ssl on;

とかしたいところだけれど動かない。
*ポート80がHTTPでポート443がHTTPSなど分けてるときは使える。

結局は

add_header Strict-Transport-Security 'max-age=31536000';

を追加して一回でもhttpsにアクセスすればhttpでもブラウザ側で何とかしてくれるようにした。

ちなみに

error_page 400 https://$server_name:$server_port$request_uri;

とか

if ($scheme = https) {
ssl on;
}

もだめ。

 

設定終わったら

HSTS Preload List Submission

でテストして、ついでに送信しておくとよい。(Chromeとかであらかじめhttpでアクセスしてもhttpsになるようブラウザに組み込んでくれるようになる)

載ったかどうかは

https://cs.chromium.org/codesearch/f/chromium/src/net/http/transport_security_state_static.json

このあたりで確認できるはず。