GitHubから脆弱性あるよって報告が来た話
3か月ほど前に
ASP.NET CoreのSignalRでバイナリーデータをやり取りする - プログラムの事とか
ってやつを書いた時に作ったサンプル用のリポジトリにGitHubからAlertがやってきました。 こんなの初めてだったからドキドキしちゃった💛
GitHubのInsights->Alertsを見るとこんなものが
CVE-2018-8409はこちら
System.IO.Piplines
の4.5.0に脆弱性があったみたいですね
NuGetで最新にしてコミットして完了
通知見た時は誰か暇な人がIssueでも投げてくれたのかと思ったんだけど、GitHubが自動で解析みたいなことして警告出してくれているんですねー
ASP.NET CoreのSignalRでバイナリーデータをやり取りする
ASP.NET CoreのSignalRのお話です (2018/7/5時点)
古いSignalRは知らない
SignalRがWebSocketを使えるなら使ってくれるのはご存知だとおもいます
んで、WebSocketのペイロードデータにはTextとBinaryのどちらかを入れることができます
データサイズに敏感な環境では極力小さいデータでやり取りしたいので、バイナリーでやり取りしてくれると助かるわけです
準備
とりあえず普通にSignalRでやり取りするサンプル作ります
Server
Visual StudioでASP.NET Core Webアプリケーション (2.1)を新規に作ってStartup.csに追記
public void ConfigureServices(IServiceCollection services) { ... services.AddSignalR(); ... } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { ... app.UseSignalR(options => options.MapHub<DataHub>("/hub/data")); ... }
DataHubはこんな感じ
public class DataHub : Hub { public void Upload(byte[] data) { System.Diagnostics.Debug.WriteLine($"Receive {data.Length}bytes."); } }
Client
.NET Framework 4.7のコンソールアプリで作ります
class Program { static async Task Main(string[] args) { var connection = new HubConnectionBuilder() .WithUrl("http://localhost:58456/hub/data") .Build(); await connection.StartAsync(); var testData = Enumerable.Range(0, 1024).Select(i => (byte)i).ToArray(); await connection.InvokeAsync("Upload", testData); await connection.DisposeAsync(); } }
クライアントは1024byteのbyte[]を送るようにしてあります
試す
両方実行して送信データを見てみます
WebSocketのデータフレーム(?)が1になってテキストとして送っていることがわかります
この時のパケットサイズは1481byte
Binaryで送る
Server
Install-Package Microsoft.AspNetCore.SignalR.Protocols.MessagePack
services.AddSignalR()
.AddMessagePackProtocol(); // 追加
Client
Install-Package Microsoft.AspNetCore.SignalR.Protocols.MessagePack
var connection = new HubConnectionBuilder() .WithUrl("http://localhost:58456/hub/data") .AddMessagePackProtocol() // 追加 .Build();
準備完了
MessagePack使うだけです、楽スギ!
試す
実行して送信データを見てみます
WebSocketのデータフレーム(?)が2になってバイナリで送ってるっぽいです
データサイズも1090byteまで減りました
まとめ
サーバーもクライアントも1行(?)追加するだけでできちゃったし、フレームワーク作る人ってすごいんだなーと改めて実感しました
今回のソースはこちら
Application Insightsの特定のログでアラートを出したい
みなさんこんにちはAzure初心者です
便利機能がいろいろあり過ぎて何を使っていいかわからない今日この頃ですが、今回はApplication Insightsの特定のログが出たらアラートを出すようにして運用を楽にします
っていうのをやろうとしたんですが、ググってもなかなかゆとり仕様のドキュメントが出てこないので試行錯誤したログになります (2018/6/28時点)
準備
とりあえず目当てのログを出すFunctionsを作ります
public static class Dummy { [FunctionName("Dummy")] public static IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequest req, TraceWriter log) { log.Warning("わーにんぐ"); return new OkResult(); } }
これで api/dummy
を呼ぶとログを出すようになります
今回はlog.Warning()
で出力されるログを対象にしようと頑張ってます (頑張っているだけ)
確認
Application Insightsの解析ページ(?どうやってこのページ出すのかよくわかっていない)でsearch "warning"
で検索すると先ほどのログが見つかりますね (それ以外も出る気がするけど気にしない)
ということでこのクエリで引っかかるレコードが1件でもあったらアラート出しましょう
アラートの追加
Azureのポータルから対象のApplication Insightsを開きます
アラート を選択
- 新しいアラート ルール を選択
ターゲットはすでに選択されていると思います
選択されていなかったらFunctionsが動いているWeb Serviceを選択
- 条件の追加を選択
シグナルの種類から 「ログ検索」を選べば「Custom log search」が出てくるのでこれを選択
検索クエリに先ほどのクエリを入れて、アラートロジックを0より大きいに
「完了」ボタンが押せるようになっているはずなので押します
- アラートの詳細を定義します
こんな感じで (重要度については後述)
- アクショングループを定義します
WebHook使って通知しようとおもいます (上のWebHookは私が作ったアクショングループ名、WebHookについては省略)
- 保存します
これで5分に1回ログを検索して見つかったらWebHookに投げてくれるようになります
WebHook作る
FunctionsでSlackに投げるようにします
しばやん先生のブログ見て真似します
飛んでくるJSONが違うのでそこだけ注意。 飛んでくるJSONの定義はこちら
このJSONのserverity
が先ほどアラートの詳細で定義した重要度になります。
重大度0~4が「low」「medium」「high」「warning」「error」という文字列になってやってきます。
4が一番ヤバイってことらしいですがそういう説明どこかにあるんですかね? (重要度なのか重大度なのかとかも)
serverityで色を変えて、あとはtitleとかtitle_linkにそれっぽいものを突っ込んでおきます
試す
Slackのデフォルトアイコンだと見たくもないWarningログをさらに見たくなくなるのでねねっちに変えて実験します
うっとうしい