ホーム » スタッフ » 斉藤徹 » Computer » Network (ページ 2)

Network」カテゴリーアーカイブ

2024年4月
 123456
78910111213
14151617181920
21222324252627
282930  

検索・リンク

Teams 説明会のトラヒック

今日は、遠隔授業に備えて教職員対象の Teams などの説明会が行われた。遠隔授業のやりかたの方針や、すでにTeamsを実践しようと試している先生の説明。最大80名ほどの視聴であった。(視聴はほとんどの方が学内)
私もTeamsでの説明を行ったが、ブラウザ画面にペン書きをしても、説明の音と動画では10秒から30秒の遅延があったと視聴していた先生が教えてくれた。であれば遅延も頭に置いた説明が必要となりそう。Teamsの生アプリと、Webアプリでも遅延がかなり違うとのことだった。
あまりにも遅延が大きいので、今回のトラヒックの状況を確認してみた。目盛りが少し切れているが、Teams会議中の、対外接続の最大の瞬間値で260Mbpsほど。本校の対外接続のmaxが1GbpsのSINET接続なので、回線としては余裕のはず。となると、遅延の原因は、Teams のサーバ側の可能性が高い。

fukuikousen-bot の更新周期を短く

福井高専のホームページの最新情報を、つぶやく bot ( https://twitter.com/FukuiKousen )を動かしているけど、この連日、コロナウィルスのため重要な公式情報の流れる機会が増えている。

通常は、5時,9時,11時,15時,19時 としていたが、当面頻度を高めておこう。8時から22時まで2時間刻みとしておく。

 

ネットワークセキュリティのためのTips

Thunderbirdの送信時エンコーディングがJISじゃなかった

とある先生から、メールが文字化けで読めないとの連絡があった。古いメールソフトを使っているとのことだったけど、私はThunderbirdで極力プレインテキストで送っているからJISコードだろうし古いメールソフトでも読めるはず…と思っていたけど、確かめると @kosen-ac.jp が BASE64 で送られていたり、@gmail.com が quoted-printable だったり。

設定を再確認したら、設定のフォントと文字エンコーディングで、デフォルトエンコーディングがUTF-8になってた。古い人間なので、送受信もデフォルトエンコーディングが「JIS(iso-2022-jp)」、「可能な限り返信でもデフォルトエンコーディングを使用」に設定を行った。

うーむ、ちゃんとJISに設定したのに、@gmail.com のメールのタイトルが、”=?UTF-8?B?…”になってら。

福井高専のドメイン名

そろそろ前期期末の成績締め切り。学生さんがレポート課題提出で先生にメールを送ることも多いが、メールアドレスの書き間違いでメールがエラーになって届かないトラブルがちらほら。

メールアドレスをどう書き間違えているのか確認すると、hoge@fukui-nctac.jp と書いていたりする。高専機構のドメイン名は、hoge@fukui.kosen-ac.jp で、ac の前がハイフンに間違えてるんだろうな。

まずは結論

高専機構(福井)のメールアドレスは、hoge@fukui.kosenac.jp です。

福井高専のメールアドレスは、hoge@fukuinct.ac.jp です。

ということで、以下解説。

ドメイン名の一般ルール

ちなみに、日本のドメイン名は古くは、組織ドメイン.種別ドメイン.国ドメイン の形式。

組織ドメイン=fukui-nct , 種別ドメイン=ac(教育機関) , 国ドメイン=jp(日本)

種別ドメインには、.co.jp(会社) , .ne.jp(ネットワークサービス) , .or.jp(団体) , .go.jp(政府機関) といったものがあるが、企業のサービスだと、.co.jp なのか .ne.jp なのか曖昧だったりするので、最近は省略したものを申請できるようになっている。

国ドメインは、アメリカはネットを作った所なので、国ドメインは省略され、.us(アメリカ) を使うことはめったに無い。一方、国ドメインも、.jp(日本) , .uk(イギリス) , .ch(中国) とかあっても、世界中に拠点を持つ企業では、.jp なのかよくわからないので、国ドメインを持たない種別ドメイン .com (企業) を取得することも多い。

高専機構のドメイン名

日本では最近様々な形式の学校が出てきたため、.ac.jp のドメインを取る時の審査は厳しくなっている。

このため、高専機構では、kosen.ac.jp を取得したいが審査が通らずしかたがないので kosenac.jp を取得している。

組織ドメイン=kosen-ac , 種別ドメイン=なし , 国ドメイン=jp(日本)

ちなみに、”-ac.jp” といった変則的なドメイン名は、教育機関を偽装したドメイン名と勘違いされやすく、kosen-ac.jp のドメイン名を見て「怪しい…」と思う人も多い。

福井高専のドメイン名

一方、高専機構ができた後の福井高専の英語の正式名称は、“National Institute of Technology, Fukui College” であり、福井高専のドメイン名としては、本来 “nit-fukui.ac.jp” を取得したい。

組織ドメインの綴りのルールは無いので、大学でも 大学名-u.ac.jp だったり u-大学名.ac.jp など色々あるが、最近は後者が主流となっている。(福井大学も以前は、fukui-u.ac.jp だったが、最近は u-fukui.ac.jp に変更されている)

しかし、.ac.jp の審査が厳しく、高専機構の1組織っぽい nit-fukui.ac.jp は審査が通らない可能性が非常に高く、どの高専も以前のドメイン名をそのまま使用しているのが現状である。

ログ解析とSOC演習(in 石川高専)

高専機構の情報セキュリティ人材育成イベントK-SECにて、主管の石川高専さんにて、「ログ解析とSOC演習」の講習会がありました。

ログ解析

セキュリティ機器の設定や組織内のルールにて、防衛を行うことはできるが、完全に脅威を検知・防御することは難しい。通信ログやアクセス履歴などの取得・蓄積しログから脅威を検出することが重要。

ログ解析演習

Raspberry-Pi のサーバが学生1人毎に準備してあり、演習用のログデータから目的となる情報を探す演習を行なった。

$ ls -R
~pi/log/event1-5/pcap/sqlinjection.pcap
~pi/log/event1-5/web-log/access_log_yyyymmdd.log

まずは基本コマンド

$ cd log/event1-5/web-log/
$ ls -al access_log_yyyymmdd.log
$ cat access_log_yyyymmdd.log | more

ユーザーエージェントの確認

$ cat access_log_yyyymmdd.log | cut -d ' ' -f 12- | more
  # cut 特定の項目を抜き出すコマンド
  #   -d ' ' データの区切り文字は ' ' 空白
  #   -f 12- 12項目以降を出力
  # more 出力をページ単位で出力
  #   大量のLOGだと、長時間かかるよぉ…

ディレクトリパストラバーサルの確認

$ grep "¥.¥./" access_log_yyyymmdd.log
  # grep 特定の文字を含む行を抜粋して表示

# アクセス履歴のPATHを確認
$ grep "¥.¥./" access_log_yyyymmdd.log | awk '{print $7}'
  # awk '{print $7}' 各行の7番目を出力 ( cut -d ' ' -f 7 と同じ )

# アクセス成功の確認
$ grep "¥./" access_log_yyyymmdd.log | grep "¥" 200"
  # Webサーバのアクセスログには、データ取得成功=200 が記載されている行を抜粋

# 特殊なアクセスPATHを確認
$ grep /proc/cpuinfo access_log_yyyymmdd.log
  # 脆弱なphp,cgiだとアクセスのURLに、アクセスしたいPATHが含まれる
  # /proc/cpuinfo は、CPUの種別などの情報が取れる

# 攻撃者のIPアドレスを確認
$ grep -h "¥./" access_log_yyyymmdd.log | awk '{print $1}' | sort | uniq -c
  # アクセスログの先頭 $1 には、IPアドレスが書いてある。
  # sort 出力をソートする(同じ行を集めるためにソート)
  # uniq -c 同じ行が繰り返す行数をカウント

OSコマンドインジェクションの確認

脆弱性のあるメール送信ページへの攻撃の確認
# addressを含む行で@を含まないものを検索
$ grep -h address access_log-yyyymm*.log | grep -v @
  # grep
  #   -h 複数ファイルの処理で、ファイル名を出力させない
  #   -v 含まない行を出力する。

$ grep -h address access_log-yyyymmdd.log | grep -v @ ¥ | awk '{print $7}' | nkf -w --url-input
  # nkf 漢字などの文字コードを変換
  #   -w UTF-8 で出力
  #   --url-input %20みたいなURLエンコードを復号
この実行結果には以下のようなものがあるかもしれない。
"address=;/bin/echo Permit_RootLogin yes >> /etc/ssh/sshd_config"

SQLインジェクションの確認

  • 不正ログイン、情報漏洩、完全性損失、可用性損失 の可能性

SOC演習

大量のログでは、unixコマンドで解析するにしても、コマンド組み合わせを考えるのは大変。企業では、ログ解析専用ソフトを用いて解析を行う。ただし、専用の解析ソフトは高価。今回は、K-SEC事業で一時的な借り物で演習。


福井高専の対外接続の速度

福井高専ではSINETによって接続されているけど、次の更新の際に十分な性能があるかのために、ネットワーク利用状況の確認。

瞬間最大風速で、150Mbps 。ムーアの法則に従うとすれば、2年で2倍と考えると、2022年で約500Mbps, 2025年で1.2Gbps 程度となる。特に今後 学内でBYODが拡大すると、さらなる通信速度が必要と考えられる。

緊急連絡システムでrblsmtpd

メモ:緊急連絡システムで、迷惑メールが届いている。変なリレーはされていないけど、エラーメールが配送できずに溜まってる。

設定を改めて確認して、迷惑メール対策が弱いのでブラックリストなメールサーバからの受信をしないように、rblsmtpd を導入。rblsmtpdの設定は、以前の運用経験からすぐに設定できるかと思ったけど qmail が systemd 用に設定ファイルが変わっているので、修正場所を探すのに手間取った。

GASを使ってLINEボットを作る

高専の KOSEN ハッカソン LINE にて、学生さんがいろいろと作品を作る間、自分でも LINE メッセージAPIで遊んでみた。

LINEボットのオーム返しの例

参考にしたサイトのプログラムを若干修正してある。

// line developersに書いてあるChannel Access Token
var access_token = "xxxxxx";

// pushしたいときに送る先のuser_id or group_idを指定する
var admin = "Uxxxx";

// postされたログを残すスプレッドシートのid
var spreadsheet_id = "xxxx";

// スプレッドシートの"user-db"シートにユーザIDと名前の対応表を保存
//   通常のサーバ処理なら、データベースに保存なんだろうけど、
//   すべてをGoogle Driveで完結させたいので、Google Spredsheed を
//   データベースのように使う。
var user_db_size = 10 ;

function get_user_name(source) {
  // スプレッドシートのuser-dbシートに、IDと名前の一覧を記録
  //  Uxxxxxxxx なまえ
  var array = SpreadsheetApp.openById(spreadsheet_id)
                .getSheetByName('user-db')
                .getRange(1,1,2,user_db_size).getValues() ;

  for( var i = 0 ; i < array.length ; i++ ) {
    if ( array[i][0] == "" ) // 無記入欄で終了
      return source.userId ;
    else if ( array[i][0] == source.userId )
      return array[i][1] ;   // 対応するものを見つけた
  }
  return source.userId ;
}

/**
 * 指定のuser_idにpushをする
 */
function push(text,to) {
  var url = "https://api.line.me/v2/bot/message/push";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + access_token,
  };
 
  var postData = {
    "to" : to,
    "messages" : [
      {
        'type':'text',
        'text':text,
      }
    ]
  };
 
  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };
 
  return UrlFetchApp.fetch(url, options);
}
/**
 * 管理者宛にメッセージを送る
 */
function push_admin(text){
  return push(text,admin);
}
 
/**
 * reply_tokenを使ってreplyする
 */
function reply(event,text) {
  var url = "https://api.line.me/v2/bot/message/reply";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + access_token,
  };

  var postData = {
    "replyToken" : event.replyToken,
    "messages" : [
      {
        'type':'text',
        'text':text ,
      }
    ]
  };
 
  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };
 
  return UrlFetchApp.fetch(url, options);
}

function do_reply(event) {
  // リプライの処理
  var text = '' ;
  switch( event.message.type ) {
    case 'text' : // メッセージ
      text = event.message.text ;
      break ;
    case 'sticker' : // ステッカー
      text = 'すてっかーID=' + event.message.id ;
      break ;
    case 'image' : // 画像
    default :
      text = 'event.message.type=' + event.message.type ;      
      break ;
  }
  return reply(event,'りぷらい:'+text);
}

/**
 * push api で beacon 受信時の処理
 */
function do_beacon(event) {
  var text = '' ;

  var user = get_user_name( event.source );

  var bcn = event.beacon ;
  switch( bcn.type ) {
    case 'enter' :  // ビーコン領域に入った
      text += 'ENTER' + bcn.hwid ;
      break ;
    case 'leave' :  // ビーコン領域を抜けた(実験したけど通知は実質来ない!?)
    case 'banner' : // ビーコンバナーをタップした
    default :
      text += bcn.type + '=' + bcn.hwid ;
      break ;
  }
  
  return push_admin( 'びーこん=' + text + '(' + user + ')' , admin ) ;
}

/**
 * postされたときの処理
 */
function doPost(e) {
  var json = JSON.parse(e.postData.contents);
  
  // 利用者のuseridを取得するためのlog
  var data = SpreadsheetApp.openById(spreadsheet_id)
               .getSheetByName('log')
               .getRange(1, 1).setValue(json.events);

  // 1回のPostで、メッセージと画像が複数のイベントで来る場合がある
  for( var i = 0 ; i < json.events.length ; i++ ) {
    var event = json.events[i] ;
    switch( event.type ) {
      case 'message' : // Message API の処理
        do_reply(event);
        break ;
      case 'beacon' : // Beacon API の処理
        do_beacon(event);
        break ;
      default: // デバッグのため
        push_admin( 'それ以外=' + event.type ) ;
        break ;
    }
  }
}
 
/**
 * pushをしてみる
 */
function test() {
  push_admin('test()の実行');
}

/**
 * getされたときの処理
 * URL?message=テキスト
 */
function doGet(e) {
  // var data = SpreadsheetApp.openById(spreadsheet_id)
  //              .getSheetByName('log')
  //              .getRange(2, 1).setValue(e.parameter.message);

  // https://script.google.com/macros/s/..../exec?message=メッセージ
  if ( "message" in e.parameter )
    push_admin(e.parameter.message);
}

Googleスピードテスト

ブラウザを用いた Google によるインターネット速度テストの結果。

自宅、500Mbps超えてたのに比べたら…(x_x;

システム

最新の投稿(電子情報)

アーカイブ

カテゴリー