プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

GitHubから脆弱性あるよって報告が来た話

3か月ほど前に

ASP.NET CoreのSignalRでバイナリーデータをやり取りする - プログラムの事とか

ってやつを書いた時に作ったサンプル用のリポジトリGitHubからAlertがやってきました。 こんなの初めてだったからドキドキしちゃった💛

GitHubのInsights->Alertsを見るとこんなものが

f:id:puni-o:20181017091731j:plain

CVE-2018-8409はこちら

NVD - 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 StudioASP.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[]を送るようにしてあります

試す

両方実行して送信データを見てみます

f:id:puni-o:20180705112245j:plain

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使うだけです、楽スギ!

試す

実行して送信データを見てみます

f:id:puni-o:20180705112823j:plain

WebSocketのデータフレーム(?)が2になってバイナリで送ってるっぽいです

データサイズも1090byteまで減りました

まとめ

サーバーもクライアントも1行(?)追加するだけでできちゃったし、フレームワーク作る人ってすごいんだなーと改めて実感しました

今回のソースはこちら

github.com

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"で検索すると先ほどのログが見つかりますね (それ以外も出る気がするけど気にしない)

f:id:puni-o:20180628180028j:plain

ということでこのクエリで引っかかるレコードが1件でもあったらアラート出しましょう

アラートの追加

  • Azureのポータルから対象のApplication Insightsを開きます

  • アラート を選択

f:id:puni-o:20180628180446j:plain

  • 新しいアラート ルール を選択

f:id:puni-o:20180628180532j:plain

ターゲットはすでに選択されていると思います

選択されていなかったらFunctionsが動いているWeb Serviceを選択

f:id:puni-o:20180628180847j:plain

  • 条件の追加を選択

f:id:puni-o:20180628180941j:plain

シグナルの種類から 「ログ検索」を選べば「Custom log search」が出てくるのでこれを選択

検索クエリに先ほどのクエリを入れて、アラートロジックを0より大きいに

f:id:puni-o:20180628181206j:plain

「完了」ボタンが押せるようになっているはずなので押します

  • アラートの詳細を定義します

f:id:puni-o:20180628181414j:plain

こんな感じで (重要度については後述)

  • アクショングループを定義します

f:id:puni-o:20180628181549j:plain

WebHook使って通知しようとおもいます (上のWebHookは私が作ったアクショングループ名、WebHookについては省略)

  • 保存します

これで5分に1回ログを検索して見つかったらWebHookに投げてくれるようになります

WebHook作る

FunctionsでSlackに投げるようにします

blog.shibayan.jp

しばやん先生のブログ見て真似します

飛んでくるJSONが違うのでそこだけ注意。 飛んでくるJSONの定義はこちら

docs.microsoft.com

このJSONserverityが先ほどアラートの詳細で定義した重要度になります。 重大度0~4が「low」「medium」「high」「warning」「error」という文字列になってやってきます。 4が一番ヤバイってことらしいですがそういう説明どこかにあるんですかね? (重要度なのか重大度なのかとかも)

serverityで色を変えて、あとはtitleとかtitle_linkにそれっぽいものを突っ込んでおきます

試す

Slackのデフォルトアイコンだと見たくもないWarningログをさらに見たくなくなるのでねねっちに変えて実験します

f:id:puni-o:20180628182943j:plain

うっとうしい