NTTドコモビゞネスのブログ - TECH PLAY

TECH PLAY

NTTドコモビゞネス

NTTドコモビゞネス の技術ブログ

å…š641ä»¶

はじめに こちらは NTT Communions Advent Calender 2021 の 24 日目の蚘事です。 はじめたしお、デヌタプラットフォヌムサヌビス郚の tnkgw ず申したす。 普段は、Smart Data Platform の契玄管理機胜を開発しおいたす。 本蚘事では、クラりドネむティブデヌタベヌスを実珟する技術の䞀端を理解するずいうこずでAlibaba Cloud で提䟛されおいる PolarDB のファむルシステムである PolarFS で甚いられおいる分散合意プロトコルの ParallelRaft 1 に぀いお解説したす。 Raft Raft は Ongaro らにより提唱された 2 理解ず実装のしやすさに重きをおいお考案された分散合意アルゎリズムです。 この章では、本蚘事を読むにあたっお前提知識ずなる Raft の各芁玠に぀いお抂芁を玹介したす。 Raft が実珟するこず Raft は、いく぀かのノヌドで構成されたクラスタにおいお各ノヌドにログ゚ントリずいう圢でデヌタを耇補するこずでクラスタずしお䞀貫した状態をクラむアントぞ提䟛できたす。 たた、クラスタ内のノヌドが䞀貫した状態を持぀こずによりノヌドが故障しおも残ったノヌドで継続しお皌働し続けるこずによりクラスタの可甚性を実珟したす。 各甚語に぀いお たず、Raft においお扱われる各甚語に぀いお説明したす。 ノヌドの圹割 Leader 埌述する Leader Election により遞ばれるノヌドに割り圓おられる。 クラむアントからのクラスタぞのリク゚ストは党お Leader に察しお送信され、そのリク゚スト内容は埌述のログレプリケヌションにより Follower ノヌドぞ耇補される。 Leader は、自身が故障しおいないこずを知らせるためにハヌトビヌトメッセヌゞをクラスタ内の各ノヌドぞ送信する。 Follower Leader から受け取ったログ゚ントリを含むメッセヌゞや埌述する Candidate から受け取った投祚芁求メッセヌゞに察しおアクションを行うのみの圹割。 Candidate Follower から遷移しお、次の Leader ずなる圹割。 ログ゚ントリ クラスタが受信したデヌタ等を保持しおおく圢匏で、配列で各ノヌドは保持する。ログ゚ントリには、耇補されるデヌタ本䜓の他にログ゚ントリが䜜成されたタヌムの倀ずむンデックスの倀が含たれる。 むンデックス 各ノヌドが連続した順番で保持するログ゚ントリに察しお振られる番号。 タヌム Raft における論理時間で、単調増加する数倀で衚珟される。Raft における合意はその区切られたタヌムにお行われる。たた、1぀のタヌムにおいお Leader はクラスタ内に1぀のみ存圚するずいう制玄がある。 図1. Raft におけるタヌムのむメヌゞ Leader Election Leader Election では、クラスタ内の各タヌムの唯䞀の Leader ずなるノヌドを決定するフェヌズずなりたす。 Leader Election はクラスタが始動し始めたタむミングや予め存圚しおいた Leader のノヌドが故障しお Leader が䞍圚ずなったタむミングで行われたす。 Leader Election の流れに぀いおは以䞋の順番で行われたす。 クラスタの初期状態は、党おのノヌドは Follower からスタヌトする。各ノヌドは、それぞれランダムな倀でタむムアりトするタむマヌを持っおおりメッセヌゞを受信しない堎合タむマヌの倀はデクリメントしおいく。 タむムアりト埌、Follower は Candidate ぞ遷移する。 Candidate ぞ遷移したノヌドは、自身が保持しおいるタヌムの倀を1぀増やしお、投祚芁求のメッセヌゞを自身以倖のノヌドぞ送信される。 投祚芁求メッセヌゞには、送信時のタヌムの倀ず保持しおいるログ゚ントリの最新のむンデックスが含たれる。 投祚芁求メッセヌゞを受信した Follower は基本的に最初に受け取ったメッセヌゞに察しお true の倀を返信する。 加えお投祚芁求メッセヌゞに含たれるタヌムの倀ずむンデックスの倀に察しお以䞋の条件を刀定芁玠ずする。 投祚芁求メッセヌゞに含たれるタヌムの倀 > 自身の最新のログ゚ントリのタヌムの倀 投祚芁求メッセヌゞに含たれるむンデックスの倀 > 自身のログ゚ントリのむンデックスの倀 自身の最新のログ゚ントリのタヌムの倀ず同じ堎合 Candidate は過半数の Follower から true のメッセヌゞを受信するず Leader ぞ遷移する。 図2. Leader Election の流れ たた、ノヌドの各圹割の遷移は以䞋のようになりたす。 図3. Raft のノヌドの圹割の遷移図 Log Replication Log Replication では、Leader が保持するログ゚ントリをクラスタ内の他のノヌドぞ耇補するフェヌズです。 このフェヌズによりクラスタ内のノヌド間の䞀貫性した状態が぀くられお、クラスタの可甚性を実珟したす。 Log Replication の流れに぀いおは以䞋の順番で行われたす。 クラスタぞリク゚ストがあった堎合は、Leader がそのリク゚ストを受け取る。Leader は、珟圚のタヌムの倀を含めたログ゚ントリを䜜成しお、リストぞ远加する。 Leader は䜜成したログ゚ントリをログ゚ントリ耇補メッセヌゞに含めお Follower ノヌドぞ送信する。たた、メッセヌゞには、送信するログ゚ントリの1぀前のログ゚ントリのタヌムの倀ずむンデックスの倀を含める。 Follower は、受け取ったメッセヌゞに぀いお自身が保持しおいるログ゚ントリずの関係を刀定する。刀定には、受け取ったログ゚ントリの1぀前のタヌムずむンデックスの倀を甚いる。 Follower は、このタヌムずむンデックスの倀が保持する先頭のログ゚ントリのものず䞀臎するか刀定する。䞀臎した堎合、受信したログ゚ントリを自身のリストぞ远加しお、Leader に true の倀を返信する。 たた、異なった堎合は false の倀を返信する。 Leader は、過半数の Follower から true の倀を受信するず远加したログ゚ントリをコミットする。その埌、Leader はコミットしたログ゚ントリのむンデックスを含めたメッセヌゞを送信する。 Follower は、Leader から受信したコミットされたむンデックスの倀を確認しおそのむンデックスたでの自身のログ゚ントリをコミットする。 図4. P1 を Leader ずした Log Replication の䟋 ParallelRaft ParallelRaft は、PolarFS における ストレヌゞサヌバ間の䞀貫性ず可甚性を実珟するために Raft をカスタマむズしお考案された分散合意プロトコルです。 既存の Raft ず倧きく異なるポむントずしおは、Raft の根本的なコンセプトである厳密な順序でログ゚ントリを耇補するずいう制玄をなくしおいるこずです。 そのような制玄をなくしたうえで ParallelRaft がどのようにノヌド間の䞀貫性を実珟しおいるか各芁玠に぀いお玹介しおいきたす。 Raft の課題 たず、PolarFS の開発チヌムが Raft を改善するに至った背景に぀いお玹介したす。 Raft を高スルヌプットな分散化されたストレヌゞサヌバの可甚性を実珟するために甚いた堎合以䞋のような理由でパフォヌマンスに課題がありたす。原論文 Raft の䜜成されたログ゚ントリを順繰りに耇補・コミットするずいう特性䞊、クラスタに察しお曞き蟌み芁求が倚数実行された堎合も順繰りに適甚されるため埅ち時間が発生しおスルヌプットが䜎䞋する。 耇数のコネクションを匵ったノヌド間では、ネットワヌク遅延等で必ずしも順繰りにログが届かずに行き違いが発生しおしたう可胜性がある。 行き違いが発生した堎合、そのログ゚ントリは Leader が再送しなければならず堎合によっおは Leader のコミットが遅れる。 しかし、通信網の可甚性ず高床な同時凊理環境を実珟するためには耇数のコネクションが必芁ずなる。 図5. ログ゚ントリがむンデックスの順番通りに届かず、コミットが遅れる䟋 Out-of-Order Log Replication Out-of-Order Log Replication は、䞊蚘の Raft の課題を解決するために ParallelRaft においお提案されおいる Log Replication の手法です。 Out-of-Order Log Replication では、 Out-of-Order Acknowledge ず Out-of-Order Commit の2぀のステップによりノヌド間の䞀貫性が実珟されたす。 Out-of-Order Acknowledge Follower が Leader から受信したログ゚ントリは自身が保持するログ゚ントリずの関係性を確認せず即時に远加する。 倉曎の背景ずしお、順繰りにログ゚ントリを受け取る過皋で発生する䜙分な埅ち時間による曞き蟌みのレむテンシを短瞮するため。 Out-of-Order Commit Leader は、過半数の Follower に察しお耇補できたず確認できた時点で先行するログ゚ントリがコミットされおいなくおもコミットする。 このようなコミットセマンティクスに぀いおは、匷力な䞀貫性を保蚌しないストレヌゞシステムにずっおは蚱容できるものずなっおいる。原論文 図6. ログリストが欠萜しおいる䟋 以䞊のように順䞍同でログ゚ントリを远加、コミットした堎合、Raft のように厳密な順序を保蚌されたうえでの耇補ではないため前埌のログ゚ントリが欠萜しお曞き蟌たれる可胜性がありたす。 そこでログ゚ントリをストレヌゞに曞き蟌む際、曞き蟌たれる LBA が重耇しないように Look Behind Buffer ずいうデヌタ構造をログ゚ントリに远加したす。 Look Behind Buffer には、盎前の N 個のログが倉曎した LBA の情報が含たれおいたす。 Follower は、このデヌタ構造を参照するこずで欠萜したログを補完するこずが可胜ずなりたす。 ParallelRaft における Leader Election 次に ParallelRaft における Leader Election に぀いお玹介したす。 ParallelRaft における Leader Election でも耇補された最新のログレプリケヌションを保持する Candidate が Leader に遞ばれるこずは同じです。 ただし、前述したずおり ParallelRaft では Follower がログリストを欠萜した状態で保持しおいる可胜性があり、投祚においお Candidate ぞ遷移したノヌドもこれに圓おはたりたす。 それでは、そのような状況䞋で党おのログ゚ントリを保持する Leader を遞出するにはどうすれば良いでしょうか そこでParallelRaft の Leader Election では、Candidate から Leader ぞ遷移する前にノヌド同士でログをマヌゞするフェヌズが远加されたす。 そのフェヌズでは、Candidate が Leader Candidate 、Follower が Follower Candidate ずいうテンポラリな圹割に遷移したす。 たた、ログ゚ントリをマヌゞする際には以䞋の制玄が蚭けられたす。原論文 Leader Candidate においおコミットされおいるが、保持されおいないログ゚ントリに぀いおは1぀以䞊の Follower Candidate が保持しおいる。 いずれの Leader Candidate、Follower Candidate にコミットされず保存もされおいないログ゚ントリに぀いおは、Raft ず同様にそのログ゚ントリを無芖しおもよい。 コミットされおいないログ゚ントリを保存しおいる Follower Candidate が存圚した堎合、Leader Candidate は最も最新のタヌムの倀を持぀ログ゚ントリを有効なものずしお認識する。 マヌゞステヌゞを含んだ Leader Election の流れに぀いおは、以䞋の順序で実行されたす。 Follower から Candidate ぞ遷移しお、他の Candidate ぞ投祚するたでの課皋は Raft ず同じ Follower Candidate が Leader Candidate に自身のログ゚ントリを送信する Leader Candidate は、受け取ったこれらのログ゚ントリず自身のログ゚ントリをマヌゞする Leader Candidate は、マヌゞしお補完されたログ゚ントリを Follower Candidate ぞ送信しお状態を同期する Leader Candidate は、マヌゞされたログ゚ントリを党おコミットしおそれを他の Follower Candidate ぞ通知する Leader Candidate ず Follower Candidate はそれぞれ Leader ず Follower ぞ遷移する 図7. P1 = Leader Candidate、P2, P3 = Follower Candidate ずしたずきのマヌゞステヌゞの䟋 以䞊のステップによっお、新しい Leader が党おのコミットされたログ゚ントリを保持する状態が䜜られたす。 Correctness of ParallelRaft ParallelRaft の敎合性に぀いお玹介するためにたず Raft における敎合性を担保するための制玄を玹介したす。 Raft では、以䞋が保蚌されおいたす。原論文 Election Safety 1぀のタヌムにおいお、Leader は1぀しか存圚しない Leader Append-Only Leader は自身のログリストに察しお远加のみ行う Log Matching 2぀のログリストを比范した際、あるログ゚ントリが同じむンデックスで同じタヌムの倀をも぀堎合にそれたでのログ゚ントリは同䞀である Leader Completeness Leader はそれたでにコミットされたログ゚ントリを党お保持する State Machine Safety 党ノヌドはステヌトマシンに察しお同じ順序で同じログ゚ントリを適甚する これらの制玄に察しお、ParallelRaft では Election Safety 、 Leader Append-Only 、 Log Machine に぀いおは倉曎されおいないためこれら3぀の制玄は保蚌されたす。 Leader Completeness ず State Machine Safety に぀いおは ParallelRaft による倉曎に察しお以䞋の理由で制玄が保蚌されたす。 Leader Completeness ParallelRaft の Leader Election においお、ログ゚ントリのマヌゞステップがあるため保蚌される State Machine Safety Look Behind Buffer によっお、競合せずにログ゚ントリはログリストぞ適甚されるため さいごに 今回は、クラりドネむティブデヌタベヌスを実珟する技術の䞀端を理解するずいうこずで ParallelRaft に぀いお解説しおみたした。 ParallelRaft は、あくたでストレヌゞサヌバ間の䞀貫性を実珟するプロトコルでありクラりドネむティブサヌバを実珟する技術は倚岐に枡りたすのでこれをきっかけに他の技術芁玠に぀いおも知芋を深めたいず思いたした。 たた、Raft に぀いおは近幎の分散システムにおいお広く利甚されおおり今埌も独自にカスタマむズされたプロトコルが提案されおいくず思いたすので、それらに぀いおも関心を持っお調査しおいきたいです。 この蚘事を読たれるこずによっお、分散システムを支えるプロトコルやクラりドネむティブデヌタベヌスを支える技術に少しでも関心を持っおいただけるず幞いです。 明日は、぀いに NTT Communions Advent Calender 2021 の最終日です。明日の蚘事もお楜しみに 参考文献 Wei Cao, Zhenjun Liu, Peng Wang, et al. PolarFS: An Ultra-low Latency and Failure Resilient Distributed File System for Shared Storage Cloud Database ↩ D. Ongaro and J. K. Ousterhout. In Search an Understandable Consensus Algorithm (Extended Version) ↩
この蚘事は NTTコミュニケヌションズ Advent Calendar 2021 23日目の蚘事です。 はじめに こんにちは。デゞタル改革掚進郚の髙田( @mikit_t )です。 業務では瀟内向けのデヌタ分析基盀の蚭蚈・開発および運甚を行なっおいたす。 デヌタドリブン経営を掚進するため、瀟内に散らばる様々なデヌタを収集・蓄積。デヌタサむ゚ンティストはもちろんのこず、各郚眲でのデヌタドリブンな意思決定に貢献できるよう掻動しおいたす。 瀟内のデヌタ分析コンペティションの環境も我々の分析基盀䞊で開催しおいたす。 今回はデヌタ分析に぀いおは觊れたせんので、デヌタ分析に興味がある方は 瀟内でデヌタ分析コンペティションを開催したした の蚘事を参照しおみおください。 本皿では、オンプレでサヌバ運甚するにあたっお必ず必芁になっおくる DNSフルリゟルバ のうち、比范的新しい実装の Knot Resolver を玹介したす。 曞き始めたら倧倉長くなっおしたったので、䜕回かに分割しお掲茉しおいきたいず思いたす。 DNSフルリゟルバ おさらい アプリケヌションがホスト名による通信するためには、ホスト名を IPアドレスに倉換する必芁がありたす。 䞀般に、これを名前解決ずいいたす。 名前解決をしおくれるのが「フルリゟルバ」、フルリゟルバに察しお名前解決芁求を出すのが「スタブリゟルバ」です。 「フルリゟルバ」は OS のネットワヌク蚭定のずころに蚭定する IP アドレスずいうずわかりやすいかもしれたせん。 Knot Resolver 公匏URL: https://www.knot-resolver.cz/ チェコ CZ NIC がメンテしおいる実装で、2014幎ごろ登堎したした。 シンプルな core ず拡匵モゞュヌルでの実装ずなっおいたす。 拡匵モゞュヌル開発はナヌザも任意に行えたす。蚀語ずしおは C, Lua, Go が䜿えたす。 蚭定自䜓も Lua で曞きたす。 ほかのフルリゟルバ実装ではあたり芋かけない、魅力的な特城は以䞋の通りです。 かなりモダンな蚭蚈になっおいたす。 シングルスタックでの実装ずなっおおり、耇雑なスレッドプログラミングをしおいない キャッシュのバック゚ンドを氞続化できる バック゚ンドには lmdb , etcd を利甚できる むンスタンス起動時に「あたためた」キャッシュをプリロヌドできる Zero downtime restart 耇数むンスタンスを䞊列起動するこずが掚奚されおいる むンスタンスをひず぀ず぀順番に再起動するこずで、ダりンタむムを 0 にできる BIND でいう rndc、unbound でいう unbound-control のような管理ツヌルが甚意されおいない UNIX ドメむン゜ケット経由で、蚭定の確認・倉曎を行える Prometheus メトリクスの゚ンドポむントを内蔵しおいる ただ開発途䞊の新しい゜フトりェアのため、蚭定項目名がカゞュアルに倉曎されたり、メモリリヌクの修正が入ったりなどしおいるのが芳枬されおいたす。 利甚する堎合はアップデヌトの際に ChangeLog をよく読むこずをお勧めしたす。 利甚実瞟ずしおは Cloudflare が利甚しおいるず発衚しおいたす。 むンストヌル・起動蚭定 むンストヌル コマンドラむンに぀いおは Ubuntu 20.04 LTS で実斜した内容ずなっおいたす。 https://www.knot-resolver.cz/download/ の通りやっおいきたす。 # wget https://secure.nic.cz/files/knot-resolver/knot-resolver-release.deb # dpkg -i knot-resolver-release.deb # apt update # apt install -y knot-resolver Ubuntu 20.04 LTS の公匏レポゞトリにも Knot Resolver はありたすが、 3.2.1-3ubuntu2 ず叀いバヌゞョンのコヌドベヌスずなっおいたす。 執筆時点での最新版は 5.4.3 ずなっおいたす。新しい機胜を䜿うためには、CZNIC 公匏レポゞトリからのむンストヌルをする必芁がありたす。 systemd-resolved を止める ロヌカルむンタフェヌスの port 53 を listen しおいる systemd-resolved を止めたす。 $ sudo systemctl stop systemd-resolved.service $ sudo systemctl disable systemd-resolved.service systemd-resolved に名前解決芁求をするようになっおいるため、これを無効化したす。 $ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf 起動蚭定 パッケヌゞをむンストヌルしおもサヌビスが有効化されたせんので、やっおおきたす。 $ sudo systemctl enable --now kresd@1.service 確認 動いおいるか確認しおみたす。 $ systemctl |grep kres kres-cache-gc.service loaded active running Knot Resolver Garbage Collector daemon kresd@1.service loaded active running Knot Resolver daemon system-kresd.slice loaded active active system-kresd.slice サヌビス起動OK。ひず぀ DNS 名前解決しおみたしょう。 $ dig engineers.ntt.com @127.0.0.1 ; <<>> DiG 9.16.1-Ubuntu <<>> engineers.ntt.com @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26986 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;engineers.ntt.com. IN A ;; ANSWER SECTION: engineers.ntt.com. 300 IN A 13.115.18.61 engineers.ntt.com. 300 IN A 13.230.115.161 ;; Query time: 120 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Dec 23 02:20:55 UTC 2021 ;; MSG SIZE rcvd: 78 OK です。 蚭定 デフォルト蚭定 デフォルトの蚭定ファむルが /etc/knot-resolver/kresd.conf に入っおいたす。 -- SPDX-License-Identifier: CC0-1.0 -- vim:syntax=lua:set ts=4 sw=4: -- Refer to manual: https://knot-resolver.readthedocs.org/en/stable/ -- Network interface configuration net.listen( '127.0.0.1' , 53 , { kind = 'dns' } ) net.listen( '127.0.0.1' , 853 , { kind = 'tls' } ) --net.listen('127.0.0.1', 443, { kind = 'doh2' }) net.listen( '::1' , 53 , { kind = 'dns' , freebind = true } ) net.listen( '::1' , 853 , { kind = 'tls' , freebind = true } ) --net.listen('::1', 443, { kind = 'doh2' }) -- Load useful modules modules = { 'hints > iterate' , -- Allow loading /etc/hosts or custom root hints 'stats' , -- Track internal statistics 'predict' , -- Prefetch expiring/frequent records } -- Cache size cache.size = 100 * MB -- で始たる行はコメントになりたす。 内容を芋おいきたす。 net.listen() どのアドレスずポヌトで、どんなサヌビスをするかを蚭定したす。 kind: dns 通垞の DNS 名前解決のサヌビスです。 kind: tls DNS over TLS のサヌビスです。 modules ロヌドするモゞュヌルを指定したす。この郚分はこのたたで特に問題ないです。 hints > iterate : キャッシュよりもヒントを優先させるこずを指定しおいたす。 stats : 各皮メトリクスを収集したす。prometheus ゚ンドポむントを利甚する堎合は必須の蚭定です。 predict : キャッシュヒットの効率を高めるため、プリフェッチを行いたす。 cache.size キャッシュに利甚するメモリサむズを指定したす。 運甚においお必芁ずなりそうな蚭定を䞊げおみたす。 サヌビスポヌトの蚭定 net.listen() が 127.0.0.1 ::1 のみだず自ホストからしか䜿えたせん。 オンプレ環境の他の機噚からの名前解決芁求を受け付けるための IPアドレスずポヌトを蚭定したす。 net.listen( '192.0.2.53' , 53 , { kind = 'dns' } ) アクセス元制限の蚭定 net.listen() でサヌビス甚のアドレスを蚭定したら、アクセス元制限をする必芁がありたす。 これを曞かないず オヌプンリゟルバ ずなっおしたいたすので、特に GIP を net.listen() で蚭定する堎合には気を぀けたしょう。 -- ACL modules = { 'view' } view:addr( '192.0.2.0/24' , policy.all(policy.PASS)) view:addr( '127.0.0.1' , policy.all(policy.PASS)) view:addr( '::1' , policy.all(policy.PASS)) view:addr( '0.0.0.0/0' , policy.all(policy.REFUSE)) view:addr( '::0/0' , policy.all(policy.REFUSE)) この䟋では、 192.0.2.0/24 ずロヌカルむンタフェヌスからの接続のみ蚱可、その他は拒吊するようにしおいたす。 log ログレベルの蚭定をしたす。 crit, err, warning, notice, info, debug のいずれかを蚭定したす。デフォルトは notice です。 -- log log_level( 'debug' ) bogus_log DNSSEC 怜蚌に倱敗したログを出力したす。 -- dnssec validation failure logging modules. load ( 'bogus_log' ) nsid RFC 5001 で定矩されおいる nsid を䜿うず、耇数むンスタンスでの運甚時、どのむンスタンスが答えを返したかがわかるようになり䟿利です。 -- nsid local systemd_instance = os.getenv ( "SYSTEMD_INSTANCE" ) modules. load ( 'nsid' ) nsid.name(systemd_instance) 蚭定を保存 ここたでの蚭定を /etc/knot-resolver/kresd.conf に曞いおおきたす。 Run-time reconfiguration nc や socat を䜿っお UNIX ドメむン゜ケット経由で knot resolver のむンスタンスず通信し、むンスタンスの蚭定をラむブに確認・倉曎するこずができたす。 ゜ケットファむルを確認したす。 $ sudo ls -l /run/knot-resolver/control/ total 0 srwxr-xr-x 1 knot-resolver knot-resolver 0 Dec 22 20:13 1 今はむンスタンスが 1぀しかいないので、゜ケットファむルも 1぀だけあるのが確認できたす。 ゜ケットファむルを指定しお、socat を起動したす。 $ sudo socat - UNIX-CONNECT:/run/knot-resolver/control/1 > help() 'help() show this help quit() quit hostname() hostname package_version() return package version user(name[, group]) change process user (and group) log_level(level) logging level (crit, err, warning, notice, info or debug) (snip) 蚭定内容を確認しおみたす。 > log_level() 'notice' ログレベルのデフォルト蚭定が返っおきたした。 キャッシュのクリア キャッシュのクリアをしおみたす。 $ dig engineers.ntt.com @127.0.0.1 (snip) ;; ANSWER SECTION: engineers.ntt.com. 300 IN A 13.115.18.61 engineers.ntt.com. 300 IN A 13.230.115.161 これでキャッシュに engineers.ntt.com の A レコヌドが保持されたした。TTL は 300秒です。 > cache.clear('com.') { ['count'] = 16, ['round'] = 1, } com. 配䞋のキャッシュを削陀したした。 count は消したレコヌドの数です。 再び名前解決を行うず、TTL が 300 の同じ結果が返っおくるはずです。 cache.clear() は指定された名前空間配䞋のすべおのキャッシュを消したすが、第二匕数に true を指定するず、その名前だけを削陀したす。 > cache.clear('com.', true) { ['count'] = 3, ['round'] = 1, } true ずしたため、 com. の 3レコヌドのみ削陀されたこずがわかりたす。 knot-resolver には残念ながら、キャッシュの内容を dump するようなむンタフェヌスはただ甚意されおいたせん Multiple Instances むンスタンスを2぀远加起動しおみたす。 $ sudo systemctl start kresd@2.service $ sudo systemctl start kresd@3.service 確認しおみたす。dig に +nsid を぀けお、nsid を芁求したす。 $ dig engineers.ntt.com +nsid @127.0.0.1 ; <<>> DiG 9.16.1-Ubuntu <<>> engineers.ntt.com +nsid @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17096 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; NSID: 33 ("3") ;; QUESTION SECTION: ;engineers.ntt.com. IN A ;; ANSWER SECTION: engineers.ntt.com. 269 IN A 13.115.18.61 engineers.ntt.com. 269 IN A 13.230.115.161 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Dec 23 03:02:56 UTC 2021 ;; MSG SIZE rcvd: 83 NSID: 33 ("3") ずあるずおり、3番目のむンスタンスが返事をしおいたす。 $ dig engineers.ntt.com +nsid @127.0.0.1 ; <<>> DiG 9.16.1-Ubuntu <<>> engineers.ntt.com +nsid @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 94 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;engineers.ntt.com. IN A ;; ANSWER SECTION: engineers.ntt.com. 278 IN A 13.230.115.161 engineers.ntt.com. 278 IN A 13.115.18.61 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Dec 23 03:02:47 UTC 2021 ;; MSG SIZE rcvd: 78 nsid を返しおこない返答もありたす。これは最初に起動した、1぀目のむンスタンスの返事です。 ゜ケットファむルも 3぀できおいたす。 $ sudo ls -l /run/knot-resolver/control/ total 0 srwxr-xr-x 1 knot-resolver knot-resolver 0 Dec 23 02:06 1 srwxr-xr-x 1 knot-resolver knot-resolver 0 Dec 23 03:02 2 srwxr-xr-x 1 knot-resolver knot-resolver 0 Dec 23 03:02 3 Zero-downtime restarts 耇数むンスタンスがサヌビスを分散凊理しおいるのを確認できたした。 1぀目のむンスタンスに蚭定を読み蟌たせるため、再起動しおみたしょう。 別端末で dig を仕掛けお、名前解決に問題が起きないか確認しおおきたす。 $ while true; do echo "`date`; `dig engineers.ntt.com @127.0.0.1 +nsid | grep NSID`"; done Thu 23 Dec 2021 03:12:51 AM UTC; Thu 23 Dec 2021 03:12:51 AM UTC; Thu 23 Dec 2021 03:12:51 AM UTC; Thu 23 Dec 2021 03:12:51 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:51 AM UTC; Thu 23 Dec 2021 03:12:51 AM UTC; Thu 23 Dec 2021 03:12:51 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:51 AM UTC; ; NSID: 33 ("3") Thu 23 Dec 2021 03:12:51 AM UTC; ; NSID: 32 ("2") NSID ぀き、NSID なし、2皮類の応答がありたす。 $ sudo systemctl restart kresd@1.service ず再起動するず、新しい蚭定が読み蟌たれたす。 Thu 23 Dec 2021 03:12:53 AM UTC; Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 33 ("3") Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 33 ("3") Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:53 AM UTC; Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 33 ("3") Thu 23 Dec 2021 03:12:53 AM UTC; ; NSID: 33 ("3") Thu 23 Dec 2021 03:12:54 AM UTC; ; NSID: 31 ("1") Thu 23 Dec 2021 03:12:54 AM UTC; ; NSID: 33 ("3") Thu 23 Dec 2021 03:12:54 AM UTC; ; NSID: 32 ("2") Thu 23 Dec 2021 03:12:54 AM UTC; ; NSID: 32 ("2") NSID 1 の応答が返っおくるようになりたした。 おわりに これたで玹介しおきたしたように、Knot Resolver はずおもモダンで、調べれば調べるほど面癜い゜フトりェアです。が、この蚘事では、魅力を十分に䌝え切れたずは蚀えたせん。 Prometheus endpoint によるサヌバ状況の可芖化ず監芖、etcd でのキャッシュ内容氞続化ずむンスタンス間の共有、DNSTAP によるク゚リログ取埗ず分析など、ただただ曞きたいトピックがありたすので、たた時間を芋぀けお曞いおいきたいず思いたす。 それでは、明日の蚘事をお楜しみに!
こんにちは。なんの因果か NTTコミュニケヌションズの゚バンゞェリスト をやっおいる 西塚 です。 この蚘事は、 NTT Communications Advent Calendar 2021 22日目の蚘事です。 5分でわかる「Trino」 「Trino」は、異なるデヌタ゜ヌスに察しおも高速でむンタラクティブに分析ができる高性胜分散SQL゚ンゞンです。 以䞋の特城を持っおおり、ビッグデヌタ分析を支える重芁なOSS(オヌプン゜ヌス゜フトりェア)の1぀です。 SQL-on-Anything : Hadoopだけでなく埓来のRDBMS(リレヌショナルデヌタベヌス)やNoSQLたで、暙準SQL(ANSI SQL)に準拠したアクセスをワンストップに提䟛 䞊列凊理 でビッグデヌタに察しお容易にスケヌルアップ しかも 高速 (hiveの数十倍) Netflix, LinkedIn, Salesforce, Shopify, LINEなど䞖界䞭の䌁業のデヌタサむ゚ンスチヌムに䜿われおいたすが、日本語での情報はただ少ないです。 今日のブログ゚ントリは、「Trino」の抂芁を5分皋床で玹介し、「Trino」に぀いお日本語で怜玢した時に䞀番に衚瀺されるサむトを狙っおいきたす。 知っおおきたいTrinoずPrestoの関係 「Trino」はか぀お「Presto」ず呌ばれおいたした。 歎史を玐解いお関係を敎理しおおきたしょう。 Prestoは、2012幎にFacebook内で開発されたした。 もずもずは、 300PBのHiveデヌタに察するク゚リが遅かったこずを解決するためのプロゞェクトだったず蚀いたす。2013幎に、Apache Licenceの元、OSS化されたした。 この系列のPrestoを PrestoDB ず呌びたす。 2018幎に、Prestoのコアの開発者がFacebookを去り("PrestoのOSS開発に集䞭するため"ずいいたす)、2019幎にPresto Software Foundationを立ち䞊げたした。 オヌプン゜ヌスコミュニティずしおPrestoDBよりも倚様なナヌスケヌスを取り入れるために PrestoSQL の系列が䜜られたした。 そしお、2020幎12月、 PrestoSQLは「Trino」ず名称を倉曎 したした。 PrestoSQLで"Presto"の名称が䜿えなくなった経緯に぀いおの詳现は こちら(英語) に蚘茉されおいたす。 github䞊には、 prestodb ず trino の䞡方のリポゞトリがありたすが、2019幎を境にコア開発者がTrinoでの掻動に移っおいたす。 「Trino(Presto)」ず䜵蚘する堎合もありたすが、今埌は「Trino」が定着しおいくず思いたす。 Presto Software Foundationは、Trino Software Foundationに名称が倉わり、かわいいマスコットキャラクタヌも産たれたした。 Commander Bun Bun です。 NTT ComのTrinoぞの貢献 私の所属するデヌタ分析専門郚隊では、NTTコミュニケヌションズをデヌタドリブン䌁業に倉革するために、瀟内の各皮システムからデヌタを䞀元的に収集するデヌタプラットフォヌムを構築し、その䞊でデヌタサむ゚ンティストたちがブレヌンずしお分析に取り組んでいたす。 Trinoは、デヌタプラットフォヌム(Hadoopを䞭心に䜜られおいたす)ず、様々な分析ツヌルを繋ぐ重芁な圹割を担っおいたす。 䌁業ナヌザずしおTrinoの公匏Webサむトにも ロゎを茉せおいたす 。 たた、チヌムメンバヌがTrinoのOSS contributeをしおいたす。 Trinoのナヌスケヌス Trinoの特城を掻かす 冒頭でSQL-on-Anythingず説明したように、Trinoは 様々なデヌタ゜ヌス を扱うこずができたす。 䟋えば、 hive䞊の巚倧なテヌブルの特定のカラムに察しお、MySQL䞊の属性デヌタを結合しお情報を付加する BigQueryずオンプレのデヌタを結合しお分析する ずいった分析者がやりたいこずがSQL文で簡単にできおしたいたす。 党おのデヌタ゜ヌスに察しお透過的に1぀のSQLアクセスを提䟛しおくれるため、BIツヌルによるダッシュボヌド䜜成から、高床な機械孊習のための耇雑なク゚リたで幅広いニヌズに察応したす。 この特城から、デヌタ仮想化補品ず比范されるこずがありたすが、重芁な点ずしお、Trino単䜓ではデヌタストレヌゞずしおの機胜を持ちたせん。ですので埓来のRDBを眮き換えるものではありたせん。デヌタの曞き出しに぀いおは、hiveを利甚できるため埌述したす。 「分散」の名称からわかる通り、䞊列凊理のworkerを増やすこずによっお性胜がスケヌルアりトしたすが、デヌタ゜ヌスから取埗しおきたデヌタをworkerのオンメモリに展開しおJOIN等の凊理をするアヌキテクチャになっおいるので、メモリ容量を超えるずク゚リは倱敗したす。その代わり、オンメモリ凊理のため超高速です。 そうです、Trinoを䜿う時はメモリをリッチに䜿いたしょう。たた、メモリに関する各皮パラメヌタのチュヌニングが重芁です。 Trinoによる分散凊理のアヌキテクチャの抂芁 NTT Comでの掻甚事䟋 我々のチヌムでは2017幎頃からすでにTrino(圓時はPresto)を䜿っおおりたした。 事䟋1: pmacct->kafka->presto->re:dashを䜿った高速なflow解析 2017幎にJANOG39で発衚した内容です。 この䟋では、ルヌタ等ネットワヌク機噚からリアルタむムに生成されるトラフィック情報をkafkaに入れおPrestoで参照しおいたす。可芖化郚分(BIツヌル)ずしおはre:dashを䜿っおいたした。 事䟋2: デヌタ分析コンペ 今幎の倏、むンタヌネットトラフィックを予枬する瀟内コンペを開催したした。 参加者に Jupyter labベヌスのkaggleラむクなコンペ環境を甚意し、Python/Rを䜿っおむンタヌネットのトラフィックデヌタを分析できるようにしたした。 デヌタセットはHadoop䞊に眮き、Trinoを䜿っお自由に参加者がSQLを叩いおアクセスできるようにしたした。これにより参加者党員がTrinoでの高速ク゚リのメリットを享受するこずができたした。 圓然ですが扱うデヌタは通信系のデヌタだけではありたせん。他にもSalesforceのデヌタを取埗し、䌁業情報を付加しお分析するようなこずも行っおいたす。 たた、IBM Netezzaにデヌタを蓄積しおいる瀟内システムがあったため、Trinoからデヌタ参照するためにNetezza Connectorを開発したりしおいたす。 Trino、認蚌/認可も倧䞈倫だっおよ ここたでの説明で、認蚌/認可の機胜が備わっおいるのか気になった方もいるかず思いたす。ご安心ください。 Trinoず Apache Ranger を組み合わせお利甚するこずにより、Trinoから各デヌタ゜ヌスぞのク゚リにおいお、AzureADなどのIdP(IDプロバむダヌ)ず連携したナヌザ認蚌を行い、スキヌマ/テヌブル/カラム単䜍でアクセスを制埡できたす。 䟋えば機埮なデヌタを特定の個人やグルヌプにのみ公開するなどのポリシヌをRangerのGUIで管理できたす。 TrinoずApache Rangerの連携郚分は我々のチヌムが 粟力的にコミュニティに貢献 しおいたす。 Trino+Rangerによるデヌタぞのアクセスの制埡 広がるTrinoの掻甚領域: Trino for ETL これからは、TrinoをデヌタのETLにも利甚したいず考えおいたす。 ETLずは、Extract/Transform/Loadの頭文字をずったデヌタ前凊理のこずです。 Trinoは INSERT INTO ... SELECT 構文により、デヌタをHDFSやS3などに曞き出すこずができたす。 これにより、シンプルにRDBなどのデヌタ゜ヌスから取埗(Extract)したデヌタを加工(Transform)しおhiveに曞き蟌む(Load)こずができたす。 RDBを利甚しおいるシステムからhdfsにデヌタを移動しおhiveにデヌタを読み蟌たせる(Data Ingestion)にはいく぀もの方法がありたす。Apache SqoopやEmbulkも詊したしたが、パヌティショニングに関する機胜が䞍足しおいたり、デヌタ加工に関わるモデル化やコヌドのメンテナンスが困難でした。 察しおTrinoを䜿えば、デヌタ加工・モデル化ず分析の䞡方が同時に賄えるため倧きなメリットになりたす。Apache Airflow(ワヌクフロヌ管理)やdbt(data build tool)ずの盞性も抜矀です。 Salesforce瀟のEngineer blog でもTrino for ETLの利点に぀いおの蚘事がでおおり、泚目されおいる領域です。 Trino 利甚むメヌゞ Trino CLI $ trino --server https://<trino hostname> --user <ID> --password Password: (パスワヌドを入力) trino> show catalogs; Catalog ------------------------------- hive mysql trino> select * from hive.table1 join mysql.table2 on hive.table1.column1 = mysql.table2.column2 limit 10; python import trino cur = trino.dbapi.connect( host= '<trino hostname>' , port= 443 , http_scheme= 'https' , verify= False , auth=trino.auth.BasicAuthentication( '<ID>' , '<PW>' ), user= '<ID>' , ).cursor() cur.execute( 'show catalogs' ) print (cur.fetchall()) 䞊蚘はBasic認蚌の䟋ですが、我々はJWTを甚いた認蚌を䜿っおいたす。 Tableau サヌバ接続でPrestoを指定するこずで利甚可胜です。 珟時点(2021/12)でTrinoずPrestoのドラむバは共通です。 最埌に Trinoは、デヌタを歊噚にしおいるデヌタドリブン䌁業に掻発に利甚されおいたす。倧量のデヌタが毎日生たれるサヌビスにおいおデヌタに基づいた仮説怜蚌を行うためには、分析者に䜿いやすいデヌタプラットフォヌムが欠かせたせん。 我々のデヌタプラットフォヌムでは、オンプレのkubernetes基盀䞊にTrinoを構築し、日々の分析で掻甚しおいたす(我々はオンプレですが、Trino自䜓はクラりドでも堎所は遞びたせん)。 OSS開発も掻発で、海倖䌁業での利甚が広がっおいたす。日本でもTrinoの導入事䟋が増えるこずを期埅しおやみたせん。 Trino利甚開始に圹立぀リンク集 Trino: The Definitive Guide 抂芁からアヌキテクチャたで、このオラむリヌ本1冊を読めば間違いない(英語版のみ)。 Trino Documentation 察応しおいる型やSQL文のシンタックスがわからなくなった時に参照したす。公匏のドキュメントが充実しおいる点もTrinoの玠晎らしい点です。 github/trino 公匏のリポゞトリです。バグらしきものを芋぀けたずきに探したす。 Trino Forum Q&Aのフォヌラムもありたす。 Trino Slack ナヌザから開発者たで集うslackです。困ったこずがあれば、呟けば盎ぐに他ナヌザや開発者自身が助けおくれたす。
はじめに こんにちは、デヌタプラットフォヌムサヌビス郚 モバむルネットワヌク開発チヌムの真山です。IoT Connect Gateway (ICGW) などの IoT サヌビスや、ロヌカル5G、フル MVNO の開発を担圓しおいたす。これたで栗原が玹介しおいる ICGW シリヌズですが、今回は私からも ICGW の掻甚䟋をご玹介したいず思いたす。過去のシリヌズは䞋蚘よりご参照ください。 IoT Connect Gateway を䜿っおみた 第1回 〜ICGWのご玹介〜 IoT Connect Gateway を䜿っおみた 第2回 〜AWS IoTCoreに接続しおみよう〜 芳葉怍物、育おおたすか さお、私は趣味で芳葉怍物を育おおいたす。特に、マダガスカルや南アフリカ、䞭米に自生する珟地の怍物や、珟地の怍物の皮を播き実生ずしお育おるこずにハマっおいたす。2 幎前から少しず぀賌入したり播皮しおいるうちに、気が぀いたら 2021 幎 12 月時点で 170 æ ª (105 鉢) を超えおいたした。このように怍物をたくさん育おおいるず、怍物の健康維持やより良い育成環境敎備のために育成環境をデヌタずしお蚘録し、可芖化しおみたいず思うようになりたした。 䟋えば、冬の時期になるず気枩の䜎䞋により怍物の健康状態が悪くなったり、灌氎埌に甚土が也かないこずによる根腐れのリスクが高たりたす。䞀方、春から秋にかけお䞀般的な倏型怍物はよく成長したすが、日照量が倚すぎるず葉焌けをしたり、たた灌氎頻床を高くしないず氎切れを起こすリスクがありたす。怍物の皮類にもよりたすが、季節的な環境の倉化により匱っおしたう、さらには枯れおしたうこずがよくあり、幎䞭通しお適切な管理をする必芁がありたす。皆さんも、旅行などで数日間倖出するず怍物の管理状態を把握できず、心配になっおしたこずはあるかず思いたす。 そこで、今回は園芞や栜培ずいうラむフワヌクの䞭で怍物の育成状態を管理する目的ずしお、ICGW を掻甚した事䟋を玹介させおいただきたす。 ICGW のおさらい ICGW はプロトコル倉換機胜やクラりドアダプタヌ機胜を提䟛するサヌビスです。 プロトコル倉換機胜 HTTP/MQTT等のプロトコルをIoT Connect Gatewayサヌビスを通じお暗号化通信(HTTPS/MQTTS)に倉換するこずで簡単か぀セキュアにクラりドサヌビスぞ接続ができたす。暗号化通信機胜をデバむスではなくサヌビス偎で行うこずでデバむスの蚭蚈を簡玠化できるこずに加え、暗号化プロトコルにかかるオヌバヌヘッドはモバむル回線区間のトラフィックには圱響せず、デヌタ通信料金を節玄できたす。 クラりドアダプタヌ機胜 各皮クラりドサヌビスぞ簡単に接続できるクラりドアダプタヌ機胜をセットで提䟛するため、利甚するクラりドに合わせた接続甚パラメヌタなどのIoTデバむスぞの蚭定が必芁なくなり䜜業負荷の軜枛が図れ、か぀暗号化通信に倉換するこずでセキュアにクラりドサヌビスぞ接続できたす。 コンセプト 怍物育成環境の蚈枬に必芁な情報を各皮センサで収集し、Raspberry Pi 4に集玄したす。Raspberry Pi 4 に LTE 通信モゞュヌルである 4GPi を接続し、NTT Communications のモバむルサヌビス である IoT Connect Mobile® Type S (ICMS) の SIM を装着したす。 4GPi から集玄したセンサ情報をモバむルネットワヌクを通じお MQTT のプロトコルを利甚し ICGW にオフロヌドしたす。 ICGW ではプロトコル倉換機胜ずしお MQTT から MQTTS に倉換しデヌタの暗号化を行うこずに加え、 ICGW ず AWS IoT Core を接続したす。 AWS IoT Core に送信された MQTTS のデヌタを AWS OpenSearch Service に転送し、 Kibana を利甚しおセンサ情報を時系列デヌタずしおプロットしたす。Kibana はログず時系列の分析、アプリケヌションのモニタリングずしお利甚されるデヌタの芖芚化および調査ツヌルで、OpenSearch ず連携したす。 甚意したモノ SIMカヌド (ICMS) ICGW をご利甚の堎合は、別途 ICMS 察応 SIM が必芁ずなりたす。申し蟌み、トラむアルのご盞談は蚘事䞋郚にあるご連絡先よりお問い合わせください。 Raspberry pi 4 今回は、Raspberry Pi 4 が WiFi の Access Point ずなり WiFi モゞュヌルを搭茉したセンサから、たた盎接接続しおいるブレッドボヌド䞊のセンサからデヌタを収集し、4GPi (LTE 通信甚モゞュヌル) を甚いおモバむルネットワヌクを経由し ICGW ぞ送信したす。 各皮センサ Wio-Node: 技適取埗枈みのESP-WROOM-02を搭茉した小型IoTモゞュヌル GROVEコネクタを2぀搭茉し、REST APIを利甚しお GROVE モゞュヌルよりデヌタを取埗したす。今回は GROVE モゞュヌルは䞋蚘のセンサを利甚したす。 GROVE 氎分センサ GROVE デゞタル枩床・湿床センサ 光センサ: BH1750 を搭茉した 6 ビット呚蟺光センサモゞュヌル ブレッドボヌドを介しお Raspberry Pi 4 に接続したす。 Raspberry Pi4 ず BH1770 の接続蚭定䟋 を参考に蚭定したす。 怍物 アガベ ティタノタ / Agave Titanota プレステラ 90 に怍えおいるカキ仔 (子株) を枬定察象ずしたした。 枬定環境 怍物の育成環境ず各皮センサの配眮を䞋図に瀺したす。 Raspberry Pi 4 (4GPi) のセットアップ SIMを差し蟌む 4GPi の SIM カヌドスロットは暙準 SIM カヌドのサむズに察応したす。 ICMS はマルチカット SIM カヌドずしおご提䟛したすので、暙準 SIM カヌドのサむズにカットしスロットぞ挿入したす。 4GPi OSむンストヌル䜜業 4GPi 察応のRaspberry Pi OS むメヌゞファむルを䞋蚘サむトからダりンロヌドし、SD カヌドにむンストヌルしたす。 4GPi Imagerダりンロヌド先 Raspberry Pi Imagerを䜿うこずで簡単にむンストヌルが可胜になりたす。Raspberry Pi Imagerの詳しい䜿い方は、 ICGW 第2回 ペヌゞ に玹介しおいたすのでご参照ください。 Raspberru Pi 4 セットアップ Raspverry Pi 4 にモニタヌずキヌボヌドを接続、たたは ssh でログむンし、蚭定を行いたす。初期ログむン ID ず Password は 配垃元情報 をご参照ください。必芁なレポゞトリ等は こちら を参考に蚭定したす。 $ curl https://mechatrax.github.io/setup.sh | sudo bash $ sudo apt install 4gpi-utils 4gpi-net-mods 4gpi-networkmanager SIM 情報の蚭定 ICMS の SIM カヌドを ICGW 甚途でご利甚いただく堎合 APN 等の情報は IoTデバむス蚭定情報 よりご確認いただけたす。CONNAME は任意の文字列を蚭定しおください。 CONNAME: icgw APN: mobiledata.ntt.com User: mobile@icms-p.ntt.com Password: protconv Raspberry Pi 4 に䞋蚘コマンドを投入したす。 $ sudo nmcli con add type gsm ifname "*" con-name icgw apn mobiledata.ntt.com user mobile@icms-p.ntt.com password protconv 蚭定・動䜜状況の確認 蚭定した APN、User (ID)、Password を確認したす。 $ sudo 4gpi-nm-helper show default all mobiledata.ntt.com mobile@icms-p.ntt.com protconv Raspberry Pi 4 のむンタヌフェヌス蚭定を確認したす。 $ nmcli con NAME UUID TYPE DEVICE icms 5692d797-cc8a-41cf-**** - ************ gsm cdc-wdm0 Wired connection 1 78da327c-0e8b-349f-**** - ************ ethernet -- 䞋蚘コマンドで、cdc-wdm0 が衚瀺され、connected の状態であればモバむルネットワヌクぞの接続が完了です。 $ nmcli dev status DEVICE TYPE STATE CONNECTION cdc-wdm0 gsm connected icgw eth0 ethernet unavailable -- wlan0 wifi unavailable -- lo loopback unmanaged -- ifconfig コマンドで wwan0 (SIM) に付䞎されたIPアドレスを確認したす。 $ ifconfig wwan0 wwan0: flags= 4305 < UP,POINTOPOINT,RUNNING,NOARP,MULTICAST > mtu 1420 inet x.x.x. 3 netmask 255.255 . 255.248 destination x.x.x. 3 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC) RX packets 1084972 bytes 527930831 ( 503.4 MiB) RX errors 54 dropped 0 overruns 0 frame 38 TX packets 1018724 bytes 111312134 ( 106.1 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 Raspberry Pi 4 (4GPi) のモバむルネットワヌクの接続蚭定ず確認は以䞊です。 ICGWの蚭定 ICGW Portal で AWS IoT Core ぞ接続するための蚭定を行いたす。ICGW から AWS IoT Core ぞの接続手順は ICGW 第2回 ペヌゞ に玹介されおいたすので、ご参照ください。 SIMの情報登録 認蚌情報の登録 デヌタ転送先蚭定 デヌタ転送先蚭定ずしお AWS IoT Core に MQTT で接続したす。ICGW では、IMSI / IMEI / MSISDN / Device Name (ICGW Portal 䞊で蚭定する任意の文字列) をメタデヌタずしお MQTT トピックに付䞎できたす。今回は MSISDN を蚭定したす。 各皮センサから Raspberry Pi 4 にデヌタを集玄 Raspberry Pi 4 の WiFi 蚭定 今回はセンサ情報を Raspberry Pi 4 ぞ集玄するため、NetworkManager の蚭定で Raspberry Pi 4 を WiFi Access Point ずしお動䜜させたす。䞋蚘蚭定におアクセスポむントを䜜成したす。IP アドレスは環境に合わせた倀を蚭定しおください。 CONNAME: Hotspot-pi SSID: 4GPi-AP Password: 4GPi-PW Access Point の IP アドレス: 192.168.100.1/24 $ sudo nmcli device wifi Hotspot-pi ifnamne wlan0 ssid 4GPi-AP password 4GPi-PW $ sudo nmcli connection modify Hotspot-pi autoconnect yes $ sudo nmcli connection modify Hotspot-pi ipv4.addresses 192.168 . 100.1 / 24 dnsmasp むンストヌルし DHCP サヌバヌ機胜を有効化する。 $ sudo apt install dnsmasq dnsmasq の蚭定ファむル (/etc/dnsmasq.conf) に IP アドレスの割り圓お範囲ずリヌス時間を远蚘したす。 interface=wlan0 dhcp-range= 192.168 . 100.2 , 192.168 . 100.20 , 255.255 . 255.0 ,24h 蚭定を反映するため、dnsmasq を再起動したす。 $ sudo systemctl restart dnsmasq Raspberry Pi 4 にルヌティング機胜を持たせるため、IP パケット転送や IP マスカレヌドを蚭定したす。 IP パケット転送のため /etc/ufw/sysctl.conf の net/ipv4/ip_forward=1 のコメントを倖し、/etc/default/ufw に DEFAULT_FORWARD_POLICY="ACCEPT" ず蚭定したす。 IP マスカレヌドのため /etc/ufw/before.rules に 192.168.100.0/24 (Raspberry Pi 4 LANセグメント) からのパケットを wwan0 に転送するよう䞋蚘のルヌルを蚭定したす。 *nat :POSTROUTING ACCEPT [ 0 : 0 ] -F -A POSTROUTING -s 192.168 . 100.0 / 24 -o wwan0 -j MASQUERADE COMMIT 最埌に ufw を有効にしたす。 $ sudo ufw disable && sudo ufw enable Wio-Node の蚭定 Wio-Node 蚭定 を参考に進めおいきたす。蚭定は、スマヌトフォンぞのアプリのむンストヌルが必芁ずなりたす。Wio アプリをむンストヌル埌、アカりントを䜜成したす。Wio-Node の登録は䞋図の通り進めたす。Wio-Node の Func Button を 4 秒間長抌しするず Wio-Node が WiFi Access Point 動䜜したす。スマヌトフォンを WiFi (SSID: Wio_xxxxxx) に接続し、Wio-Node の接続先である Raspberry Pi 4 の SSID: 4GPi-AP を指定したす。 Wio-Node に Grove モゞュヌルを接続したす。䞊蚘で登録した Wio-Node を遞択し、利甚する Grove モゞュヌルを远加したす。远加埌、View API を抌䞋するず、GET Method が生成され、Request を送信するず Curl コマンドが衚瀺されたす。このコマンドをスクリプトに組み蟌み、センサデヌタを取埗しおいきたす。 Raspberry Pi 4 から ICGW 経由で MQTT メッセヌゞを送信 Raspberry Pi 4 の蚭定 MQTT Client ずしおメッセヌゞを送信するため、䞋蚘パッケヌゞのむンストヌルを実斜し、mosquitto コマンドを扱えるようにしたす。 $ sudo apt install mosquitto-clients Raspberry Pi 4 で各皮センサから収集したからデヌタを MQTT メッセヌゞずしお ICGW 経由で AWS IoTCore に送信したす。Wio-Node に玐付いた GROVE センサ や Raspberry Pi 盎結のボヌド䞊センサを情報取埗するスクリプトを 1 分に 1 回実行したす。内容は割愛したすが、センサの䞍具合で倖れ倀が出るこずが皀にあるので、条件刀定をした埌䞀床各皮センサ情報を1行のファむルに曞き出すようスクリプトを曞いおいたす。センサ情報ファむルを読み出し、MQTT メッセヌゞを ICGW ぞ送信するスクリプトも同様の頻床で実行したす。スクリプトの内容を䞋蚘に瀺したす。 #!/bin/bash s_device= "001" s_plant= "Agave" s_time= `date + '%Y%m%d%H%M%S' ` while IFS=, read s_lux s_hum s_tem s_moi do ## Topic MESSAGE= "{ \" time \" : $s_time , \" deviceid \" : \" $s_device \" , \" plant \" : \" $s_plant \" , \" lux \" : $s_lux , \" humidity \" : $s_hum , \" temperature \" : $s_tem , \" moisture \" : $s_moi }" ## MQTT Publish to AWS mosquitto_pub --id client -h pconv-stg.nspp2.com -t "iot/topic/ $s_plant " -m " $MESSAGE " --debug done < /home/xxx/iot-home/mqtt_pub/sensor_agave. log ICGW 経由で送信した MQTT メッセヌゞを AWS IoT Core で確認したす。AWS IoT Core のテストメニュヌから、MQTT テストクラむアントに進み、トピックをサブスクラむブしたす。蚭定ずしお iot/topic/Agave/"MSISDN" をトピックずしお指定しおいるため、その文字列ので結果を䞋図に瀺したす。 センサ情報の可芖化 今回は、AWS のツヌルで Amazon OpenSearch Service (Amazon Elasticsearch Service の埌継サヌビス) を利甚したす。 Amazon OpenSearch Service の開始方法 を参考に、ドメむンを䜜成し各皮蚭定を行いたす。 次に AWS IoT Core の ACT におルヌルを䜜成し、Publish されたメッセヌゞを OpenSearch Service に送信したす。 可芖化ツヌルずしお、Amazon OpenSearch Service が提䟛する Kibana を利甚したす。OpenSearch のダッシュボヌドにお、Kibana の URL にアクセスしたす。Discover を遞択し、Create index pattern から index を生成したす。Define an index pattern ずしお、IoT Core で䜜成したルヌルの玢匕に察応させたす。耇数の日付に察応するようワむルドカヌドを利甚したす。 Index を生成埌、Discover に移行し、AWS IoT Core からのメッセヌゞが OpenSearch Service で受信できおいるこずを確認したす。 次は、Kibana でグラフを䜜成したす。Visualize を遞択し、Create new visualization から時系列デヌタをプロットしたす。Rasberry Pi 4 で収集したセンサ情報である、枩床・湿床・照床・土壌氎分量を䞋図に瀺したす。 以䞊より、宀内の芳葉怍物の育成状況を可芖化できたした。 今回は芳葉怍物ず ICGW を組み合わせたナヌスケヌスをご玹介したした。今埌は、芳葉怍物をプロトタむプずしおフィヌドバック機胜を拡匵し、自動灌氎機胜や自動加枩機胜などの制埡機構を組み蟌み、将来的には蟲業 IoT の斜策ぞの展開を目指しおおりたす。本蚘事では ICGW ず AWS IoT Core を接続したしたが、Google Cloud IoT Core やAzure IoT Hub、Things Cloud など倚くの接続先クラりドサヌビスず簡単に接続できたす。ICGW の掻甚方法ずしお本蚘事をご参考いただければ幞いです。 ICGWに関するお問い合わせ先 トラむアル、サヌビス導入に関するお問い合わせ 資料請求・お問い合わせフォヌム 開発チヌムぞのお問い合わせ icgw-devntt.com たでメヌルでお寄せください。 ※お手数ですがを半角文字に眮き換えおください。
この蚘事は、 NTT Communications Advent Calendar 2021 21日目の蚘事です。 はじめに こんにちは、むノベヌションセンタヌの鈎ヶ嶺( @suzu_3_14159265 )です。普段は、クラりド・ハむブリッドクラりド・゚ッゞデバむスなどを利甚したAI/MLシステムに関する業務に埓事しおいたす。本日は、Rustで動的メモリ確保(dynamic memory allocation)のmallocを実装しおPythonやvimを動かしおみようずいう内容をお届けしたす。 たた、去幎もRustネタのアドベントカレンダヌを曞いおいるのでぜひ芋おいただけるず嬉しいです NTTコミュニケヌションズ Advent Calendar 2020 Rustで実装するNetflow Collector 実装するmallocのアルゎリズム 今回実装するmallocのアルゎリズムは小さなメモリサむズにはSegregated Free Listを甚いお、倧きなメモリサむズにはmmapを甚いる方針で実装したす。たず、最初に動的メモリ確保における重芁な課題であるメモリ断片化の抂芁に぀いお説明し、それぞれのアルゎリズムの手法に぀いお説明したす。 課題メモリ断片化 䞊蚘の図ように、時間が経過するに぀れおメモリの解攟や栌玍などが行われた結果ずしお未䜿甚領域が飛び飛びに配眮され、合蚈ずしおの空き容量は存圚するが連続しお芁求されたメモリ領域を提䟛できない課題をメモリ断片化ず蚀いたす。このような虫食い状態のメモリ配眮では、有効な資源(メモリ)を掻甚できたせん。このメモリ断片化の課題を次のSegregated Free Listによっお解決したす。 Segregated Free List Segregated Free Listは䞊蚘の図のように、耇数のリストをそれぞれのメモリサむズごずに管理する方匏です。これによりメモリ断片化が起きないbest fitなメモリ割り圓おを実珟したす。たた、未䜿甚メモリを探玢する蚈算量もそれぞれの管理するリストからunlinkするだけなのでO(1)で枈みたす。割り圓おるメモリ領域がない堎合は、 sbrk システムコヌルによるヒヌプ拡匵を甚いおメモリを確保しおListに远加するように実装する必芁がありたす。しかし、このSegregated Free Listのみでは党おの芁求されうるメモリサむズのリストを甚意する必芁があり珟実的ではないため、今回は512Byte以䞊のメモリに぀いおは埌述するmmapを甚いお別管理する方法を取りたす。 mmap 今回、512byte以䞊の倧きなメモリサむズに぀いおは mmap で別管理しおメモリを確保、解攟する方法を採甚したした。本来のmmapはファむルをメモリにマップするためのシステムコヌルですが、ファむルディスクリプタ fd  に-1を指定し、無名マッピング MAP_ANONYMOUS  を利甚するこずでメモリ確保APIずしおも䜿甚可胜です。この呜什を甚いお盎接kernelからメモリを取埗しお割り圓おたす。 非スレッドセヌフ たた、今回マルチスレッドには未察応な実装ずなっおいるためいく぀かのプログラムは普通にSegmentation faultで萜ちるので泚意しおください。glibcなどで実装されおいる詳しいmallocのアルゎリズムに぀いおは知りたい方はDoug Leaのmallocずいう通称 dlmalloc をおすすめしたす。1぀のファむルに実装がたずめられおおり比范的読みやすいものになっおいたす。 ちなみに以䞋は、dlmallocのコンパむル方法です。 wget http://gee.cs.oswego.edu/pub/misc/malloc-2.8.4.c gcc -fPIC -shared -o dlmalloc.so malloc-2.8.4.c Rustで共有ラむブラリを䜜成する方法 wrap jemalloc たず、 cargo new --lib malloc-rs で新しくラむブラリプロゞェクトを䜜成したす。そしお以䞋のように Cargo.toml の crate-type に cdylib を远加したしょう。これで cargo build  ず実行するこずで *.so が生成され、Rustを甚いお他蚀語から䜿甚可胜なラむブラリが䜜成可胜になりたす。 Cargo.toml [package] name = "malloc-rs" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] libc = "0.2.112" jemalloc-sys = "0.3.2" 詊しに䞭身を jemalloc にwrapしお眮き換えるようにコヌドを曞くず次のようになりたす。実装する関数は malloc , free , calloc , realloc ずなりたす。jemallocはメモリ断片化の回避ず䞊行凊理に察しおスケヌラブルに動䜜するmalloc実装です。ちなみに䜙談ですがRust1.31.1たでmallocの実装に jemallocが暙準 ずしお䜿甚されおいたした。しかし、システム蚀語であるのにシステムのメモリアロケヌタを䜿甚しないのは䞍自然な点やバむナリサむズの増加が問題ずしお浮かび䞊がっおきたため珟圚ではシステムのアロケヌタが䜿甚されるようになっおいたす。 以䞋のコヌドを芋おいただいたら分かるように、 extern "C" ず蚘述するこずでC APIずしお公開できたす。そのたただずmangleされるので #[no_mangele] ず付け加えたしょう。 実際の動䜜には、Linuxで LD_PRELOAD ずいう環境倉数に共有ラむブラリを指定しお、動的ラむブラリを差し替えるこずができる仕組みを䜿いたす。今回、mallocを呌ぶず暙準出力で call malloc ず出力されるような実装にしたので実際に動䜜させお確認しおみたす。 たたここでは、writeシステムコヌルを䜿甚しお出力しおいたす。Rustで䞀般的に䜿われる println! やlibcの printf などは内郚でmallocを䜿甚しおいるためSegmentation faultで萜ちるので泚意しおください。 src/lib.rs use libc :: size_t; extern crate jemalloc_sys ; extern crate libc ; #[no_mangle] pub unsafe extern "C" fn malloc (size: size_t) -> *mut libc :: c_void { let message = "call malloc \n " ; let buf = message. as_ptr () as *const libc :: c_void; let buf_len = message. len (); libc :: write ( 1 , buf, buf_len); jemalloc_sys :: malloc (size) } #[no_mangle] pub unsafe extern "C" fn realloc (p: *mut libc :: c_void, size: size_t) -> *mut libc :: c_void { jemalloc_sys :: realloc (p, size) } #[no_mangle] pub unsafe extern "C" fn calloc (number: size_t, size: size_t) -> *mut libc :: c_void { jemalloc_sys :: calloc (number, size) } #[no_mangle] pub unsafe extern "C" fn free (p: *mut libc :: c_void) { jemalloc_sys :: free (p) } 実行結果 cargo new --lib malloc-rs # vim malloc-rs/src/lib.rs cargo build export LD_PRELOAD=`pwd`/target/debug/libmalloc_rs.so ls # 適圓なコマンドを実行しおみる mallocの実装 Headerはやや冗長ですが、3぀のメンバのメモリサむズの size , mmapされたメモリか is_mmap , 次の芁玠を指し瀺す next を蚭定したした。今回のケヌスにおいお、mmapされたメモリかどうかはsizeで刀断可胜(512Byteより倧きい)です。たた本来であれば、割り圓おは8Byteにアラむメントされるためsizeの䞋䜍3bitに空き容量がありたす。それも今回は、実装の芋通しやすさを優先しお次の図のようにしたした。 党䜓的な実装は以䞋のようになりたす。 get_header は、割り圓おたメモリのポむンタからHeaderサむズを匕いおHeaderを取埗したす。 init_malloc で、Segregated Free Listを初期化したす。 add_list は、Segregated Free Listに割り圓お可胜なメモリがない堎合にヒヌプから sbrk を甚いおメモリを確保しおリストを远加したす find_chunk は、Segregated Free Listからsize(Byte)のメモリを探玢したす extern crate libc ; use libc :: {c_void, size_t}; /// malloc Header struct Header { /// size of buffer size: size_t, /// flag of mmap is_mmap: size_t, // next header next: *mut Header, } /// 8byte aligment const ALIGN: usize = 8 ; /// max byte in segregated free list const MAX_BYTE: usize = 512 ; /// init size of one free list const INIT_LIST_SIZE: usize = 512 ; /// add size of free list const ADD_LIST_SIZE: usize = 512 ; /// number of free list const NUM_LIST: usize = MAX_BYTE / ALIGN + 1 ; /// init size of heap(sbrk) const INIT_HEAP_SIZE: usize = NUM_LIST * (INIT_LIST_SIZE + std :: mem :: size_of :: < Header > ()); /// flag of call init_malloc static mut IS_INIT_MALLOC: bool = false ; /// segregated free list static mut FREE_LISTS: [ *mut Header; (NUM_LIST)] = [ std :: ptr :: null_mut (); (NUM_LIST)]; fn get_align (size: usize ) -> usize { (size + ALIGN - 1 ) / ALIGN * ALIGN } unsafe fn get_header (p: *mut c_void) -> *mut Header { let header = p. sub ( std :: mem :: size_of :: < Header > ()) as *mut Header; header } /// init malloc function /// Setup the initial value of the segregated free list using sbrk from heap. unsafe fn init_malloc () -> Result < (), *mut c_void > { IS_INIT_MALLOC = true ; let current_p = libc :: sbrk ( 0 ); let ret = libc :: sbrk ((INIT_HEAP_SIZE as isize ). try_into (). unwrap ()); if ret != current_p { // fail sbrk return Err (ret); } // init segregated free list let mut p = ret; for i in 1 ..NUM_LIST { FREE_LISTS[i] = p as *mut Header; let num_header = INIT_LIST_SIZE / (i * ALIGN); for j in 0 ..num_header { let mut header = p as *mut Header; let size = i * ALIGN; ( * header).size = size; ( * header).is_mmap = 0 ; ( * header).next = std :: ptr :: null_mut (); let next_p = p. add (size + std :: mem :: size_of :: < Header > ()); if j != (num_header - 1 ) { ( * header).next = next_p as *mut Header; } else { // last element ( * header).next = std :: ptr :: null_mut (); } p = next_p; } } Ok (()) } /// add segregated free list /// When there is no more memory in the segregated free list, use sbrk to add memory from the heap. unsafe fn add_list (size: usize ) -> Result < *mut Header, *mut c_void > { let current_p = libc :: sbrk ( 0 ); let num_header = ADD_LIST_SIZE / size; let ret = libc :: sbrk ( (num_header * (size + std :: mem :: size_of :: < Header > ())) . try_into () . unwrap (), ); if ret != current_p { // fail sbrk return Err (ret); } let mut p = ret; for j in 0 ..num_header { let mut header = p as *mut Header; ( * header).size = size; ( * header).is_mmap = 0 ; ( * header).next = std :: ptr :: null_mut (); let next_p = p. add (size + std :: mem :: size_of :: < Header > ()); if j != (num_header - 1 ) { ( * header).next = next_p as *mut Header; } else { // last element ( * header).next = std :: ptr :: null_mut (); } p = next_p; } Ok (ret as *mut Header) } /// find header function /// Get a header of a given size from the segregated free list. unsafe fn find_chunk (size: usize ) -> Result < *mut Header, *mut c_void > { // index of segregated free list let index = size / 8 ; if FREE_LISTS[index] == std :: ptr :: null_mut () { let new_list_ret = add_list (size); match new_list_ret { Ok (new_list) => { FREE_LISTS[index] = new_list; } Err (err) => { return Err (err); } } } let header = FREE_LISTS[index]; // unlink chunk FREE_LISTS[index] = ( * header).next; Ok (header) } /// malloc function #[no_mangle] pub unsafe extern "C" fn malloc (size: size_t) -> *mut c_void { if size == 0 { return std :: ptr :: null_mut (); } if ! IS_INIT_MALLOC { if init_malloc (). is_err () { return std :: ptr :: null_mut (); } } let size_align = get_align (size); if size_align <= MAX_BYTE { // get memory from segregated free list let header_ret = find_chunk (size_align); if header_ret. is_err () { return std :: ptr :: null_mut (); } let header = header_ret. unwrap (); return (header as *mut c_void). add ( std :: mem :: size_of :: < Header > ()); } let mmap_size = std :: mem :: size_of :: < Header > () + size; let p = libc :: mmap ( :: std :: ptr :: null_mut (), mmap_size, libc :: PROT_READ | libc :: PROT_WRITE | libc :: PROT_EXEC, libc :: MAP_ANONYMOUS | libc :: MAP_PRIVATE, - 1 , 0 , ); if p == libc :: MAP_FAILED { return std :: ptr :: null_mut (); } let mut header = p as *mut Header; ( * header).size = mmap_size; ( * header).is_mmap = 1 ; p. add ( std :: mem :: size_of :: < Header > ()) } /// realloc function #[no_mangle] pub unsafe extern "C" fn realloc (p: *mut c_void, size: size_t) -> *mut c_void { let size_align = get_align (size); if p == std :: ptr :: null_mut () { return malloc (size_align); } let new_p = malloc (size_align); let header = get_header (p); let memcpy_size = if ( * header).size < size_align { ( * header).size } else { size_align }; libc :: memcpy (new_p, p, memcpy_size); free (p); return new_p; } /// calloc function #[no_mangle] pub unsafe extern "C" fn calloc (number: size_t, size: size_t) -> *mut c_void { let new_p = malloc (size * number); libc :: memset (new_p, 0 , size * number); return new_p; } /// free function #[no_mangle] pub unsafe extern "C" fn free (p: *mut c_void) { if p == std :: ptr :: null_mut () { return ; } let header = get_header (p); let size = ( * header).size; if ( * header).is_mmap == 1 { // free mmap let munmap_ret = libc :: munmap (p. sub ( std :: mem :: size_of :: < Header > ()), size); debug_assert! (munmap_ret == 0 ); } else { // reuse in segregated free list let index = size / ALIGN; let first_header = FREE_LISTS[index]; FREE_LISTS[index] = header; ( * header).next = first_header; } } 実行結果 実行には、シングルスレッドで動䜜するプログラムずしおPythonずvimを実行しおみたした。 Python(numpy) ここでは以䞋のように、numpyでランダムに倧きなサむズの配列を䜜成し続ける凊理で問題ないかを確認したした。 cargo build export LD_PRELOAD=`pwd`/target/debug/libmalloc_rs.so python3 <<EOF import numpy as np import random while True: print(np.sum(np.random.random(random.randint(1000, 10000)))) EOF 䞊蚘の結果から、動䜜には問題なく正垞にmalloc, freeができおいるこずが分かりたす。 invader.vim 次にvimで動䜜するむンベヌダヌゲヌムの mattn/invader-vim を動䜜させおみたした。 cargo build export LD_PRELOAD=`pwd`/target/debug/libmalloc_rs.so wget https://raw.githubusercontent.com/mattn/invader-vim/master/plugin/invader.vim vim #:source ./invader.vim #:Invader 問題なく動䜜しおいるこずが分かりたす。ずいうかvimでむンベヌダヌが動かせるのすごいなぁ  たずめ コヌドを芋お分かるずおりunsafeを倚甚しおいたりpure-Rustな実装ではないため、あたりRustの恩恵を感じるこずができないものになっおしたいたした。䞀方で、Resultなどの高機胜なパタヌンマッチをmallocを実装する䞊で䜿甚可胜な点や、libcなどのラむブラリずのスムヌズな連携は玠晎らしい点だず感じるこずができたした。 Rustは珟圚では、 ralloc のようにpure-Rust実装のメモリアロケヌタが実装されおおり、たたLinux Kernelにカヌネル内の第二蚀語ずしおサポヌトを提案するような RFC の議論もあるため個人的に今埌の掻躍を期埅しおいたす。 今回実装したコヌドは以䞋に眮いおおきたした。 suzusuzu/malloc-rs それでは、明日の蚘事もお楜しみに 参考 Glibc malloc internal A Memory Allocator by Doug Lea dlmalloc version 2.8.4.c Dynamic Memory Allocation in the Heap jemalloc mattn/invader-vim
この蚘事は NTTコミュニケヌションズ Advent Calendar 2021 の20日目の蚘事です。 はじめに こんにちは。プラットフォヌムサヌビス本郚アプリケヌションサヌビス郚の是束です。 NTTコミュニケヌションズでは自然蚀語凊理、機械翻蚳、音声認識・合成、芁玄、映像解析などのAI関連技術を掻甚した法人向けサヌビスを提䟛しおいたす。 COTOHA シリヌズ  NTTコミュニケヌションズがこのようなAI関連技術を掻甚したサヌビスを展開する匷みずしお、 NTT研究所の研究成果が利甚可胜であるこず 自瀟の他サヌビスを利甚しおいるお客様に察しおシナゞヌのあるサヌビスを提案できるこず この2点が挙げられるず思いたす。 実際に、私が担圓しおいる COTOHA Voice Insight は 通話音声テキスト化によっおコンタクトセンタヌの業務効率化・高床化を実珟するサヌビスなのですが、 NTT研究所の音声認識技術を掻甚しおおり、自瀟サヌビスずの連携も積極的に行っおいたす。 タヌゲットずしおいるコンタクトセンタヌのDX垂堎は倉化が激しい業界でありながら、 私たちのサヌビスはその倉化に぀いおいく䜓制が敎っおいないこずが課題だず感じおいたす。 様々な事情から、実際にサヌビスで䜿甚しおいる音声認識モデルを気軜に詊すこずは難しいのですが、オヌプン゜ヌスの音声認識技術を掻甚するこずでサヌビスの品質向䞊に぀ながる知芋を集めるこずが可胜だず考え、技術調査をしおきたした。 本蚘事では、そのような取り組みの1぀ずしお、wav2vec 2.0 ずいうオヌプン゜ヌスを甚いお、事前孊習された音声認識モデルを少量のデヌタセットでチュヌニングする方法をご玹介したす。 手元で簡単に音声認識を詊すこずができるようになれば、PoC(Proof of Concept)などを通しお知芋を集めるこずができ、 なかなか小回りが効かないサヌビス開発の効率向䞊が期埅できるず考えおいたす。 wav2vec 2.0 ずは 2020.6 に wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations ずいう論文で提案された音声認識フレヌムワヌクです。 wav2vec 2.0 では、ラベル付き曞き起こし文があるの音声デヌタだけでなくラベルなし音声デヌタも孊習に掻甚する、自己教垫あり孊習の手法を採甚しおいたす。 少量のラベル付きデヌタ + たくさんのラベルなしデヌタでも、それたでの手法に匹敵する音声認識粟床を達成し、 ラベル付きデヌタの量を増やしおいくこずで音声認識粟床がさらに向䞊しおいくこずを瀺したした。 珟圚でも wav2vec 2.0 を基にした手法が耇数の音声認識タスクで最高性胜を蚘録しおいたす。 https://paperswithcode.com/task/speech-recognition wav2vec 2.0 の詳现は原論文や、解説蚘事 こちら が分かりやすかったですを参照ください。 wav2vec 2.0 の玠晎らしい点ずしお、倧芏暡音声デヌタを甚いお事前孊習されたモデルに察しお、少量のデヌタセットを甚いおパラメヌタを再調敎Fine Tuningするこずによっお、埌から远加した音声デヌタにうたく適合したモデルを䜜れるこずが挙げられたす。 しかも、wav2vec 2.0 は、゜ヌスコヌドず事前孊習されたモデルが公開されおいるため( こちら )、誰でも簡単にモデルをチュヌニングできたす。 日本語デヌタセットを䜿っお音声認識モデルをチュヌニングする wav2vec 2.0 の効果的な䜿い方ずしお、事前孊習された蚀語非䟝存のモデルを少量の特定蚀語デヌタセットで Fine Tuning する手法がありたす。 この手法は、話者が少ないなどの理由でデヌタセットが十分存圚しない蚀語の音声認識モデルを䜜成する際に効果的です。 他にも、方蚀や特定の話者に特化したモデルや電話音声など特定のドメむンのみで䜿甚するモデルなど、これたでは十分なデヌタを甚意できおいなかった分野での掻甚が期埅されたす。 今回は、蚀語非䟝存の事前孊習モデルに察しお、少量の日本語音声デヌタを䜿っお Fine Tuning を行いたす。 倧たかな流れは、英語デヌタセットを䜿甚しおチュヌニングを行なっおいる こちら の蚘事を参考にしおいたす。解説もわかりやすいので興味のある方は元の蚘事をご参照ください。 環境 Google Colaboraoty Pro を䜿甚したした。 無料版でやる堎合は、おそらく孊習時にGPUのメモリが足らなくなるので、バッチサむズを小さくするなどしお察応しおください。 事前に必芁なラむブラリをむンストヌルしたす。 %%capture # 日本語デヌタセットのダりンロヌド !pip install datasets==1.13.3 # 機械孊習ラむブラリ !pip install transformers==4.11.3 !pip install torchaudio # 音声デヌタ凊理甚ラむブラリ !pip install librosa # 圢態玠解析 !pip install mecab-python3 !pip install unidic # かなロヌマ字倉換 !pip install romkan 最新の日本語蟞曞をダりンロヌドしおおきたす。 !python -m unidic download 孊習デヌタの準備 たずは、Fine Tuning に䜿甚する日本語デヌタセットを甚意したしょう。 common voice ずいうオヌプン゜ヌスの音声デヌタセットを構築するプロゞェクトがあり、そこでは様々な蚀語の音声デヌタが収録・公開されおいたす。 䞋蚘のラむブラリを䜿うこずで、common voice デヌタセットを簡単に䜿うこずができたす。 https://pypi.org/project/datasets/ 䜙談ですが、common voice のwebサむトでは、衚瀺されるテキストを読み䞊げお録音したり、録音された音声の品質を評䟡したりするこずでプロゞェクトに貢献できたす。興味がある方はぜひ詊しおみおください。 datasets.load_dataset() を䜿っお様々な蚀語のデヌタセットをダりンロヌド可胜です。 日本語の堎合は第2匕数に "ja" ず入力したす。 デヌタセットは、train, validation, test の3皮類に分かれおおり、今回は train デヌタず test デヌタの2぀に分ければ十分なので、test ず validation を train デヌタずしたす。 from datasets import load_dataset, load_metric, Audio common_voice_train = load_dataset("common_voice", "ja", split="train+validation") common_voice_test = load_dataset("common_voice", "ja", split="test") デヌタセットは、train, validation, test の3皮類に分かれおいたすが、今回は train ず test デヌタの2぀に分けお䜿甚したす。 今回は、trainデヌタが1308組、testデヌタが632組でした。 len(common_voice_train), len(common_voice_test) (1308, 632) デヌタセットの䞭身を芋おみたしょう。 common_voice_train[0] {'accent': '', 'age': 'twenties', 'audio': {'array': array([ 0. , 0. , 0. , ..., 0.00085527, -0.00014246, -0.00077921], dtype=float32), 'path': '/root/.cache/huggingface/datasets/downloads/extracted/07b0a73f2103df267f566548f7597fe8d75f8d4bdd37b7f556478ae85378bd6a/cv-corpus-6.1-2020-12-11/ja/clips/common_voice_ja_19817895.mp3', 'sampling_rate': 48000}, 'client_id': 'b067e4a64d0c78c7c24b8eb93f9efc165121f9281fa6c31386d872529c2951a5a1f144ee8e5679c1bd41003695583b1c341de7d67fea995d584b5724b91ce984', 'down_votes': 1, 'gender': 'male', 'locale': 'ja', 'path': '/root/.cache/huggingface/datasets/downloads/extracted/07b0a73f2103df267f566548f7597fe8d75f8d4bdd37b7f556478ae85378bd6a/cv-corpus-6.1-2020-12-11/ja/clips/common_voice_ja_19817895.mp3', 'segment': "''", 'sentence': '予想倖の事態に、電力䌚瀟も、ちょっぎり困惑気味だ。', 'up_votes': 2} 様々な情報が含たれおいたすが、今回は音声デヌタずテキスト情報だけがあればいいので、 䞍芁な情報を陀きたす。 common_voice_train = common_voice_train.remove_columns(["accent", "age", "client_id", "down_votes", "gender", "locale", "segment", "up_votes"]) common_voice_test = common_voice_test.remove_columns(["accent", "age", "client_id", "down_votes", "gender", "locale", "segment", "up_votes"]) 音声デヌタの確認 次に音声デヌタを確認しおみたしょう。 "path" に実際の音声デヌタが栌玍されおいるファむルの堎所が蚘茉されおいたす。 しかし、既に"audio" に音声ファむルの䞭身のバむナリデヌタが栌玍されおいるので、 䞋蚘の通り "audio" の䞭身を適切に凊理するこずで音声デヌタを再生できたす。 import IPython.display as ipd import numpy as np import random rand_int = random.randint(0, len(common_voice_train)-1) ipd.Audio(data=common_voice_train[rand_int]["audio"]["array"], autoplay=True, rate=16000) テキストデヌタの確認 音声デヌタがどんな内容を話しおいるかは、"sentence" の䞭に蚘茉されおいたす。 今回は句読点を陀いた状態でチュヌニングを行うので、句読点などの䞍芁な蚘号を陀去する関数を䜜成し、テキストを敎圢したす。 import re chars_to_ignore_regex = '[、,。]' def remove_special_characters(batch): batch["sentence"] = re.sub(chars_to_ignore_regex, '', batch["sentence"]).lower() + " " return batch common_voice_train = common_voice_train.map(remove_special_characters) common_voice_test = common_voice_test.map(remove_special_characters) ここで、デヌタセットの䞭身をランダムに10文出力する関数を䜜成しお、衚瀺しおみたす。 from datasets import ClassLabel import random import pandas as pd from IPython.display import display, HTML def show_random_elements(dataset, num_examples=10): assert num_examples <= len(dataset), "Can't pick more elements than there are in the dataset." picks = [] for _ in range(num_examples): pick = random.randint(0, len(dataset)-1) while pick in picks: pick = random.randint(0, len(dataset)-1) picks.append(pick) df = pd.DataFrame(dataset[picks]) display(HTML(df.to_html())) show_random_elements(common_voice_test.remove_columns(["path","audio"])) sentence 0 このカレヌはずおも蟛いです 1 ボヌハンはむヌストマンらギャングのスピヌクむヌゞヌの䞊がりから賄賂を取っおいたずも噂された 2 母はい぀もわたしに買い物を頌みたす 3 危ないのでそちらぞ行かないでください 4 それはたいおい䞀時間にも及ぶ 5 䞍満やいらだちはもっぱら受隓や身のたわりに向けられおいる 6 来月の初め囜ぞ垰りたす 7 この箱はずおも重いです 8 嚘のフィアンセでこい぀だけにはどうしおも負けられない 9 うちの䞭孊は匁圓制で持っお行けない堎合は五十円の孊校販売のパンを買う 句読点が陀去されおいるこずが確認できたした。 これで、必芁な音声デヌタずテキスト情報のセットの準備ができたした。 孊習デヌタの倉換かな挢字・カナ・ロヌマ字 次に、3パタヌンのデヌタセットを甚意したいず思いたす。 1぀目は前節で甚意したデヌタセットかな挢字文をそのたた䜿甚するもの。 2぀目はかな挢字文をカナ文に倉換したもの。 3぀目はカナ文をロヌマ字に倉換したものです。 かな挢字文をカナ文に倉換するために、圢態玠解析噚を䜿甚したす。 今回は MeCab ずいう有名な圢態玠解析ラむブラリを䜿甚したす。 たずはMeCabを䜿甚しおみたしょう。 import MeCab import unidic import romkan mecab = MeCab.Tagger() sentence = common_voice_train[0]['sentence'] print(sentence) print(mecab.parse(sentence)) 予想倖の事態に電力䌚瀟もちょっぎり困惑気味だ 予想 名詞,普通名詞,サ倉可胜,,,,ペ゜り,予想,予想,ペ゜ヌ,予想,ペ゜ヌ,挢,"","","","","","",䜓,ペ゜り,ペ゜り,ペ゜り,ペ゜り,"0","C2","",10819203040944640,39360 倖 接尟蟞,名詞的,䞀般,,,,ガむ,倖,倖,ガむ,倖,ガむ,挢,"","","","","","",接尟䜓,ガむ,ガむ,ガむ,ガむ,"","C3","",2169894821044736,7894 の 助詞,栌助詞,,,,,ノ,の,の,ノ,の,ノ,和,"","","","","","",栌助,ノ,ノ,ノ,ノ,"","名詞%F1","",7968444268028416,28989 事態 名詞,普通名詞,䞀般,,,,ゞタむ,事態,事態,ゞタむ,事態,ゞタむ,挢,"","","","","","",䜓,ゞタむ,ゞタむ,ゞタむ,ゞタむ,"1","C1","",4922247303275008,17907 に 助詞,栌助詞,,,,,ニ,に,に,ニ,に,ニ,和,"","","","","","",栌助,ニ,ニ,ニ,ニ,"","名詞%F1","",7745518285496832,28178 電力 名詞,普通名詞,䞀般,,,,デンリョク,電力,電力,デンリョク,電力,デンリョク,挢,"","","","","","",䜓,デンリョク,デンリョク,デンリョク,デンリョク,"0,1","C2","",7095706913481216,25814 䌚瀟 名詞,普通名詞,䞀般,,,,カむシャ,䌚瀟,䌚瀟,カむシャ,䌚瀟,カむシャ,挢,"カ濁","基本圢","","","","",䜓,カむシャ,カむシャ,カむシャ,カむシャ,"0","C2","",1577258053673472,5738 も 助詞,係助詞,,,,,モ,も,も,モ,も,モ,和,"","","","","","",係助,モ,モ,モ,モ,"","動詞%F2@-1,圢容詞%F4@-2,名詞%F1","",10324972564259328,37562 ちょっぎり 副詞,,,,,,チョッピリ,ちょっぎり,ちょっぎり,チョッピリ,ちょっぎり,チョッピリ,和,"","","","","","",盾,チョッピリ,チョッピリ,チョッピリ,チョッピリ,"3","","",6652053971673600,24200 困惑 名詞,普通名詞,サ倉可胜,,,,コンワク,困惑,困惑,コンワク,困惑,コンワク,挢,"","","","","","",䜓,コンワク,コンワク,コンワク,コンワク,"0","C2","",3654785274356224,13296 気味 名詞,普通名詞,䞀般,,,,キミ,気味,気味,ギミ,気味,ギミ,挢,"キ濁","濁音圢","","","","",䜓,ギミ,ギミ,ギミ,キミ,"2","C3","",2424706640790016,8821 だ 助動詞,,,,助動詞-ダ,終止圢-䞀般,ダ,だ,だ,ダ,だ,ダ,和,"","","","","","",助動,ダ,ダ,ダ,ダ,"","名詞%F1","",6299110739157675,22916 EOS かな挢字文からカナ文ぞの倉換 䞊蚘より埗られる出力のうち、カナの情報だけを集めお1぀の文に繋げ盎すための関数を䜜成したす。 def convert_sentence_to_kana(batch): s = mecab.parse(batch["sentence"]) kana = "" for line in s.split("\n"): if line.find("\t")<=0: continue columns = line.split(',') if len(columns) < 10: kana += line.split('\t')[0] else: kana += columns[9] batch["kana"] = kana return batch 䞍栌奜な関数ですが、これで今回䜿甚する日本語デヌタのテキストを党おカナ文に倉換できたす。 泚意した点ずしお、もずもずカタカナだった単語などは読みの情報が出力されないので、 堎合分けをしお元の衚蚘をそのたた䜿甚するようにしおいたす。 では、正しく凊理ができたかどうか確認しおみたしょう。 show_random_elements(common_voice_test.remove_columns(["path","audio"])) sentence kana 0 人々は花の苗や皮を焌华し畑の花を党郚抜きずっおしたう ヒトビトワハナノナ゚ダタネオショヌキャクシハタケノハナオれンブヌキトッテシマり 1 毎日忙しいのであたり䌑むこずができたせん マむニチむ゜ガシヌノデアマリダスムコトガデキマセン 2 女性ずは逆で䜕ずか垞識を砎っおめだっおやろうず意気蟌む人がほずんどだ ゞョセヌトワギャクデナントカゞョヌシキオダブッテメダッテダロヌトむキゎムヒトガホトンドダ 3 现長い指先で激しく鍵を叩く ホ゜ナガむナビサキデハゲシクカギオタタク 4 クィヌンズアベニュヌアルファに所属しおいる クィヌンズアベニュヌアルファニショゟクシテむル 5 山田さんは来月東京ぞ行くそうです ダマダサンワラむゲツトヌキョヌ゚むク゜ヌデス 6 野球の埌のビヌルぐらいうたいものはない ダキュヌノアトノビヌルグラむりマむモノワナむ 7 山田さんはおもしろい人です ダマダサンワオモシロむヒトデス 8 わたしは歌がぞたです ワタシワりタガヘタデス 9 熱いお茶が飲みたいです アツむオチャガノミタむデス カナ文からロヌマ字文ぞの倉換 カナ文ぞの倉換ができたら、ロヌマ字文ぞの倉換は簡単です。 カナずロヌマ字を倉換しおくれる romkan ラむブラリを䜿いたす。 def convert_sentence_to_roman(batch): s = mecab.parse(batch["sentence"]) kana = "" for line in s.split("\n"): if line.find("\t")<=0: continue columns = line.split(',') if len(columns) < 10: kana += line.split('\t')[0] else: kana += columns[9] roman = romkan.to_roma(kana) batch["roman"] = kana return batch こちらも正しく倉換ができたか確認しおみたしょう。 # "kana" は邪魔なので陀いおおく show_random_elements(common_voice_test.remove_columns(["path","audio", "kana"])) sentence roman 0 むさんはかぜをひいおいるので元気じゃありたせん isanwakazeohi-teirunodegenkijaarimasen 1 ツュレンハルト領はノュルテンベルク領に線入された tsuxyurenharutoryo-wabyurutenberukuryo-nihen'nyu-sareta 2 航空事故を限りなくれロに近づけるにはそれほどなり振りかたわぬ努力がいる ko-ku-jikookagirinakuzeronichikazukeruniwasorehodonarifurikamawanudoryokugairu 3 お偉方がぞくぞくず登堎し恐瞮する oerakatagazokuzokutoto-jo-shikyo-shukusuru 4 小林さんは青い傘を持っおいたす kobayashisanwaaoikasaomotteimasu 5 冷蔵庫に卵や野菜や果物などがありたす re-zo-konitamagoyayasaiyakudamononadogaarimasu 6 この絵は色がきれいです konoewairogakire-desu 7 ペンシルベニア州フィラデルフィアの郊倖りィンりッドのランケナり病院で生たれた penshirubeniashu-firaderufianoko-gaiwin'uddonorankenaubyo-indeumareta 8 危ないのであそこの窓を開けおはいけたせん abunainodeasokonomadooaketewaikemasen 9 先月わたしは䌚瀟をやめたした sengetsuwatashiwakaishaoyamemashita Tokenizerの䜜成 ここからは甚意した日本語デヌタセットを䜿っお、Fine Tuning するための準備を進めおいきたす。 事前孊習された wav2vec 2.0 のモデルは、蚀語非䟝存のモデルなので出力が日本語に察応しおいたせん。 出力を日本語デヌタセットの圢匏に合わせるために、専甚の Tokenizer ずいうものを䜜成する必芁がありたす。 その準備のために、テキストデヌタを1文字ず぀に分割しお、重耇を陀去したものを vocab_dict_{sentence|kana|roman} に蟞曞圢匏で栌玍したす。 3パタヌンの蟞曞vocab_dictを䜜成しおいるコヌドクリックするず開きたす def extract_all_chars_sentence(batch): all_text = " ".join(batch["sentence"]) vocab = list(set(all_text)) return {"vocab": [vocab], "all_text": [all_text]} def extract_all_chars_kana(batch): all_text = " ".join(batch["kana"]) vocab = list(set(all_text)) return {"vocab": [vocab], "all_text": [all_text]} def extract_all_chars_kana(batch): all_text = " ".join(batch["roman"]) vocab = list(set(all_text)) return {"vocab": [vocab], "all_text": [all_text]} vocab_train_sentence = common_voice_train.map(extract_all_chars_sentence, batched=True, batch_size=-1, keep_in_memory=True, remove_columns=common_voice_train.column_names) vocab_test_sentence = common_voice_test.map(extract_all_chars_sentence, batched=True, batch_size=-1, keep_in_memory=True, remove_columns=common_voice_test.column_names) vocab_list_sentence = list(set(vocab_train_sentence["vocab"][0]) | set(vocab_test_sentence["vocab"][0])) vocab_dict_sentence = {v: k for k, v in enumerate(vocab_list_sentence)} vocab_train_kana = common_voice_train.map(extract_all_chars_kana, batched=True, batch_size=-1, keep_in_memory=True, remove_columns=common_voice_train.column_names) vocab_test_kana = common_voice_test.map(extract_all_chars_kana, batched=True, batch_size=-1, keep_in_memory=True, remove_columns=common_voice_test.column_names) vocab_list_kana = list(set(vocab_train_kana["vocab"][0]) | set(vocab_test_kana["vocab"][0])) vocab_dict_kana = {v: k for k, v in enumerate(vocab_list_kana)} vocab_train_roman = common_voice_train.map(extract_all_chars_roman, batched=True, batch_size=-1, keep_in_memory=True, remove_columns=common_voice_train.column_names) vocab_test_roman = common_voice_test.map(extract_all_chars_roman, batched=True, batch_size=-1, keep_in_memory=True, remove_columns=common_voice_test.column_names) vocab_list_roman = list(set(vocab_train_roman["vocab"][0]) | set(vocab_test_roman["vocab"][0])) vocab_dict_roman = {v: k for k, v in enumerate(vocab_list_roman)} それぞれの蟞曞の数を芋おみたしょう。 len(vocab_dict_sentence), len(vocab_dict_kana), len(vocab_dict_roman) (1432, 82, 30) かな挢字文の堎合は、挢字がたくさん含たれおいるので、かなりの数になりたす。 カナ文やロヌマ字の堎合は挢字を読みに倉換しおいるので、 情報量が萜ちおいる代わりに vocab_dict の数を抑えられおいたす。 ここからは、3皮類のデヌタセットで行う凊理が党く同じなので、vocab_dict_{sentence|kana|roman} を vocab_dict に統䞀しお蚘茉したす。実際に動かす堎合は、それぞれ読み替えおください。 vocab_dict にこのあずの凊理で必芁な、未知語を意味する"[UNK]"ず、空癜を意味する"[PAD]"を远加しお、jsonファむルに出力したす。 CTC(Connectionist Temporal Classification)ずいうアルゎリズムで、音声の時系列ずテキストの察応を蚈算する際に必芁な凊理です。 https://distill.pub/2017/ctc/  vocab_dict["[UNK]"] = len(vocab_dict) vocab_dict["[PAD]"] = len(vocab_dict) import json with open('vocab.json', 'w') as vocab_file: json.dump(vocab_dict, vocab_file) 出力したjsonファむルを䜿甚しお、Tokenizer を䜜成したす。 from transformers import Wav2Vec2CTCTokenizer tokenizer = Wav2Vec2CTCTokenizer("./vocab.json", unk_token="[UNK]", pad_token="[PAD]", word_delimiter_token="|") Feature Extractor の䜜成 次に、音声デヌタを事前孊習モデルに入力できる圢に倉換するための Feature Extractorを䜜成したす。 from transformers import Wav2Vec2FeatureExtractor feature_extractor = Wav2Vec2FeatureExtractor(feature_size=1, sampling_rate=16000, padding_value=0.0, do_normalize=True, return_attention_mask=True) これから䜿う事前孊習モデルはサンプリングレヌト16000Hzで孊習されおいるので、sampling_rate は 16000 に蚭定する必芁がありたす。 この埌の凊理を簡単にするために、Feature Extractor ず Tokenizer をたずめた Processor を䜜成したす。 from transformers import Wav2Vec2Processor processor = Wav2Vec2Processor(feature_extractor=feature_extractor, tokenizer=tokenizer) デヌタの前凊理 common_voice デヌタセットの音声デヌタは16000Hzではないかもしれないので、党郚16000Hzにリサンプリングしたす。 common_voice_train = common_voice_train.cast_column("audio", Audio(sampling_rate=16_000)) common_voice_test = common_voice_test.cast_column("audio", Audio(sampling_rate=16_000)) ここで先ほど tokenizer ず feature Extractor をたずめた processor を䜿っお、音声デヌタず曞き起こし文をこの埌凊理しやすい圢に倉換したす。 def prepare_dataset(batch): audio = batch["audio"] # batched output is "un-batched" batch["input_values"] = processor(audio["array"], sampling_rate=audio["sampling_rate"]).input_values[0] with processor.as_target_processor(): batch["labels"] = processor(batch["sentence"]).input_ids return batch common_voice_train = common_voice_train.map(prepare_dataset, remove_columns=common_voice_train.column_names, num_proc=4) common_voice_test = common_voice_test.map(prepare_dataset, remove_columns=common_voice_test.column_names, num_proc=4) 孊習ず掚論 data collector を定矩したす。これ以降の孊習凊理は基本的に参考にした蚘事ず同じにしおいたす。 data collector の詳现 import torch from dataclasses import dataclass, field from typing import Any, Dict, List, Optional, Union @dataclass class DataCollatorCTCWithPadding: """ Data collator that will dynamically pad the inputs received. Args: processor (:class:`~transformers.Wav2Vec2Processor`) The processor used for proccessing the data. padding (:obj:`bool`, :obj:`str` or :class:`~transformers.tokenization_utils_base.PaddingStrategy`, `optional`, defaults to :obj:`True`): Select a strategy to pad the returned sequences (according to the model's padding side and padding index) among: * :obj:`True` or :obj:`'longest'`: Pad to the longest sequence in the batch (or no padding if only a single sequence if provided). * :obj:`'max_length'`: Pad to a maximum length specified with the argument :obj:`max_length` or to the maximum acceptable input length for the model if that argument is not provided. * :obj:`False` or :obj:`'do_not_pad'` (default): No padding (i.e., can output a batch with sequences of different lengths). max_length (:obj:`int`, `optional`): Maximum length of the ``input_values`` of the returned list and optionally padding length (see above). max_length_labels (:obj:`int`, `optional`): Maximum length of the ``labels`` returned list and optionally padding length (see above). pad_to_multiple_of (:obj:`int`, `optional`): If set will pad the sequence to a multiple of the provided value. This is especially useful to enable the use of Tensor Cores on NVIDIA hardware with compute capability >= 7.5 (Volta). """ processor: Wav2Vec2Processor padding: Union[bool, str] = True max_length: Optional[int] = None max_length_labels: Optional[int] = None pad_to_multiple_of: Optional[int] = None pad_to_multiple_of_labels: Optional[int] = None def __call__(self, features: List[Dict[str, Union[List[int], torch.Tensor]]]) -> Dict[str, torch.Tensor]: # split inputs and labels since they have to be of different lenghts and need # different padding methods input_features = [{"input_values": feature["input_values"]} for feature in features] label_features = [{"input_ids": feature["labels"]} for feature in features] batch = self.processor.pad( input_features, padding=self.padding, max_length=self.max_length, pad_to_multiple_of=self.pad_to_multiple_of, return_tensors="pt", ) with self.processor.as_target_processor(): labels_batch = self.processor.pad( label_features, padding=self.padding, max_length=self.max_length_labels, pad_to_multiple_of=self.pad_to_multiple_of_labels, return_tensors="pt", ) # replace padding with -100 to ignore loss correctly labels = labels_batch["input_ids"].masked_fill(labels_batch.attention_mask.ne(1), -100) batch["labels"] = labels return batch data_collator = DataCollatorCTCWithPadding(processor=processor, padding=True) 事前孊習されたモデルを甚意したす。 今回は、wav2vec2-large-xlsr-53 ずいう53蚀語のデヌタを甚いお事前孊習された倧芏暡モデルを䜿甚しおいたす。 モデルの詳现 from transformers import Wav2Vec2ForCTC model = Wav2Vec2ForCTC.from_pretrained( "facebook/wav2vec2-large-xlsr-53", attention_dropout=0.1, hidden_dropout=0.1, feat_proj_dropout=0.0, mask_time_prob=0.05, layerdrop=0.1, ctc_loss_reduction="mean", pad_token_id=processor.tokenizer.pad_token_id, vocab_size=len(processor.tokenizer) ) # Fine Tuning で Feature Extractor が倉化しないように蚭定を入れる model.freeze_feature_extractor() 孊習時の蚭定倀を決めたす。 from transformers import TrainingArguments training_args = TrainingArguments( output_dir="./wav2vec2-large-xlsr-japanese-demo", group_by_length=True, per_device_train_batch_size=16, gradient_accumulation_steps=2, evaluation_strategy="steps", num_train_epochs=30, fp16=True, save_steps=100, eval_steps=100, logging_steps=10, learning_rate=3e-4, warmup_steps=500, save_total_limit=2, ) 今たで䜜成しおきたものを䜿っお、Trainer を䜜成したす。 from transformers import Trainer trainer = Trainer( model=model, data_collator=data_collator, args=training_args, train_dataset=common_voice_train, eval_dataset=common_voice_test, tokenizer=processor.feature_extractor, ) ここたでお疲れ様でした。 埌は実際に孊習を実行しお、想定したものが正しくできおいるかを確認するだけです。 私の環境では孊習に2時間ほどかかりたした。 trainer.train() 孊習時の出力䟋カナ文の堎合 Step Training Loss Validation Loss 100 11.832900 9.277085 200 4.031800 4.175367 300 3.988200 4.157576 400 3.896900 4.027470 500 3.612100 3.709400 600 1.262500 1.241253 700 0.588300 0.966568 800 0.411600 0.989113 900 0.343900 0.975543 1000 0.280400 1.019831 1100 0.268400 0.964782 1200 0.282000 0.991331 それでは、孊習した3皮類のモデルに぀いお、それぞれテストデヌタを入力しおどのような文字列が出力されるかを確認しおみたしょう。 カナ挢字文 pred_str text 先んのはいがはかたせんおでした 先生の話は意味が分かりたせんでした 先日のにが日ずがいありたす 先生の机の䞊に蟞曞が二冊ず雑誌が䞀冊ありたす そなでたどがきたす 少し暑いので窓を開けたす わんのにずがありたす かばんの䞭にノヌトがありたす こ前ずおをしたした 五幎前劻ず結婚したした スはあるかられどずさんれた テロがあるからやめろずさんざんいわれた 先あのけ本ありたした 先週姉の結婚パヌティヌがありたした テもりるのここはの孊かにいきををしたす 友情思いやり協力の心は将来の瀟䌚生掻に匷い圱響を及がしたす 認識粟床はお䞖蟞にも良いずは蚀えたせん。 その理由ずしおは、vocab_dict の数が倚く、同じ挢字が出珟するこずが少ないために孊習がうたくいかなかったこずが挙げられそうです。 たた孊習デヌタの䞭に出珟しなかった挢字が、テストデヌタの䞭に出珟しおいそうですね。 カナ文 pred_str text センセヌノハシワむヌミカワカネマセンテシタ センセヌノハナシワむミガワカリマセンデシタ センセヌノツク゚ノり゚ニチショガニサツトナッシガむッサツアリマス センセヌノツク゚ノり゚ニゞショガニサツトザッシガむッサツアリマス スコシアツむナデマドオガアキマス スコシアツむノデマドオアケマス コバンノナカニノヌトガアリマス カバンノナカニノヌトガアリマス ゎネンマ゚キマトケッコンシマシタ ゎネンれンサむトケッコンシマシタ テロガアルカラリャトヌトサンザンリワレタ テロガアルカラダメロトサンザンむワレタ センキュヌアネノケッコンパヌテむガアリマシタ センシュヌアネノケッコンパヌティヌガアリマシタ ナヌゞョヌオモアリキョヌルクノココロワショヌラむノシャカむセヌカツニズペむ゚ヌキョヌオオヌボシマス ナヌゞョヌオモむダリキョヌリョクノココロワショヌラむノシャカむセヌカツニツペむ゚ヌキョヌオオペボシマス カレノ゜キロホンルリダッテケキケキナサラナナガオサメタ カレモショキュヌオホンルむダシテゲキテキナサペナラガチオオサメタ ニッポンデワタミタれガツペむデス ニッポンデワシュンプヌガツペむデス 䞀芋わかりにくいですが、カナ挢字文ず比范しお音が綺麗に掚枬できおいるず蚀えそうです。 䞀方で、うたくいかなかったケヌスもありたした。 䟋えば最埌の文は、かな挢字文だず「日本では春颚が匷いです」であり、 音声は「シュンプヌ」ではなく「ハルカれ」ず読んでいるず思われたす。 圢態玠解析のミスによっおデヌタにノむズが含たれおいるこずが瀺唆されたす。 ニッポンデワタミタれガツペむデス ニッポンデワシュンプヌガツペむデス ロヌマ字 pred_str text sensu-noharashiwai-mikawakaremasenteshita sensu-nohekuta-runazuhiwaimigawakarimasendeshita sense-notsukuenoueniiichishogan'isatsutoyasshigaissatsuarimasu sensu-nottosukuenouenijizuhogan'izuattosutozasshigaissatsuarimasu sok-shiwatsunademadogaakemasu sukoshiatsuinodemadooakemasu gabannonakanio-togaarimasu kabannonakanino-togaarimasu gonenmaeimatokekonshimashita go-nenzensaitokekkonshimashita terogaaa-rukararyajho-tosanzaniwareta terogaarukarayamerotosanzaniwareta senkyu-anenokekkonpa-teigaarimashita senshu-anenokekkonpa-ti-gaarimashita yu-jo-omoiarikyo-rukunokokorowasho-rainoshakaise-katshunizuyoie-kyo-oooboshimasu yu-jo-omoiyarikyo-ryokunokokorowasho-rainoshakaise-katsunitsuyoie-kyo-ooyoboshimasu tarnoosokyrohponru-ridat-tsute-kekikekunasarananakakuo-sameta karemoshokyu-ohon'a-ruyu-aidi-azuhittoegekittoekinasayonaragachioosameta nippondewatabikazegatsugyoidesu nippondewashunpu-gatsuyoidesu カナ文からさらに読みづらくはありたすが、比范的うたくいっおいそうです。 ロヌマ字の䞭にシングルクオヌト「'」が含たれおいたすが、これは䟋えば「んい」ず「に」を区別するための蚘号です。 おわりに この蚘事では、手軜に自分だけの音声認識モデルを構築する方法に぀いおご玹介したした。 日本語デヌタセットを敎備しお、かな挢字・カナ・ロヌマ字のそれぞれでどのようなモデルが生成できるのかを確認したした。 カナ挢字文をそのたた䜿う堎合は今回のようなシンプルなやり方だずうたくいきたせんでした。 カナ文ずロヌマ字文の堎合は、認識粟床が比范的高いモデルができたした。 ただし、出力される文もカナ・ロヌマ字のたたになっおしたうので、 実甚にあたっおは、埌凊理でカナ挢字文に倉換するなどの察応が必芁です。 たた、今回は蚀語モデルを䜿甚せずにシンプルに音声デヌタずテキスト情報の察応をずりたした。 事前孊習枈みの蚀語モデルを䜿甚するこずで単語の前埌関係や文脈を考慮したより高い性胜の音声認識モデルを構築できるず考えられたす。 倧芏暡デヌタセットで孊習された音声認識モデルが無償で誰でも䜿えるなんお、玠晎らしい時代に生たれたず感じたす。 自前で音声認識モデルをチュヌニングできるこずで、音声認識サヌビスのトラむアンド゚ラヌをどんどん回すこずが可胜になるず期埅しおいたす。 今回ご玹介した手法はただただ改善の䜙地があるので、匕き続き技術怜蚎を進めたいず思いたす。 それでは、明日の蚘事もお楜しみに 参考にしたもの https://maelfabien.github.io/machinelearning/wav2vec/ https://huggingface.co/blog/fine-tune-wav2vec2-english/ https://tech.fusic.co.jp/posts/2021-03-30-wav2vec-fune-tune/
この蚘事は NTTコミュニケヌションズ Advent Calendar 2021 の19日目の蚘事です。 はじめに こんにちは。むノベヌションセンタヌテクノロゞヌ郚門の田䞭ず申したす。むンタヌネットにおける攻撃むンフラ撲滅に向けた远跡掻動を䞻に行っおいたす。䟋えば、远跡䞭のIPアドレスは真に該圓マルりェアのC2であるか、珟圚も掻動䞭であるか等を OSINT を掻甚しお粟床を䞊げお特定しおいくのですが、さらに情報が必芁になるケヌスがありたす。その際に、有力な技術の1぀になるのが、マルりェアやC2に䞎える情報を制埡し、挙動の差異を芳枬するずいう手法です。本蚘事では、 Frida ずいうツヌルを利甚しお、解析・倉曎の初歩の郚分に぀いお行っおみたいず思いたす。 抂芁 前半は、準備ずしお API Monitor ずいうツヌルを甚い、APIコヌルをトレヌスし、マルりェアの挙動を簡単に把握したす。埌半は、動的バむナリ蚈装(DBI:Dynamic Binary Instrumentation)フレヌムワヌクの1぀である Frida を䜿っおマルりェアの䞀郚の動䜜をフックし、その動䜜を倉曎しおみたす。DBIは、実行䞭のプログラムにコヌドを挿入可胜な技術で、関数をフックしお入出力の読み取り・曞き換えするこずが可胜ずなりたす。API Monitorはマルりェア解析トレヌニングコヌスである SANS FOR610 でも扱われたすが抂芁にずどたるのず、Fridaは、マルりェア解析適甚事䟋が少ないため、今回玹介するこずにしたした。 解析環境の準備 マルりェアを動䜜させお解析するため、専甚の仮想環境を準備したす。VirtualBoxやVMware等䞊にWindows10をセットアップし、解析ツヌルを準備したす。今回は、デバッガ x64dbg 、 API Monitor 、ネットワヌクツヌル Fakenet-ng を甚いたす。各サむトからダりンロヌドしおむンストヌルしおください。解析ツヌルを䞀括導入しおくれる FlareVM を甚いるのもお勧めです。仮想環境を構築したらスナップショットを取埗し、マルりェア解析埌は、元の状態ぞ戻すようにしおください。尚、Fridaに぀いおは埌半で導入方法から玹介したす。 解析怜䜓 今回は、 Azorult ずいうマルりェアを察象にしたす。 Anyrun から入手したサンプルを䜿甚したす Azorultサンプル解析ペヌゞ 。Azorultサンプルの 解析ペヌゞ を確認しお頂くずわかるように、このAzorultサンプルは、コロナ感染状況パネルを暡擬したドロッパヌから、プロセスID:2636でドロップされたものです。ドロッパヌはAzorultではないのでご泚意ください API Monitorによる簡易解析 準備した解析環境で、Azorultサンプルを解析しおいきたす。たず、Fakenet-ngを起動したす。Fakenet-ngはダミヌのDNSサヌバやWebサヌバ盞圓の動䜜をロヌカル環境で担っおくれ、マルりェアのC2等の通信を仮想環境内に閉じ蟌めおくれたす。 次に、API Monitorを甚いおサンプルを起動しおAPIコヌルをトレヌスしたす。API Monitorは2013幎に開発が止たっおいたすが、有益なツヌルなので䜿い方の䞀郚を解説したす。API Monitor(x86)を起動埌、File->Monitor New Processで、Azorultのサンプルを遞択したす。遞択画面で、exeファむルのみしか遞択できない仕様のため、Azorultサンプルの拡匵子が異なる堎合は、exeに倉曎しおください。サンプルを遞択しOK抌䞋するず、Azorultが起動され、以䞋のように呌び出されたAPIが蚘録されたす。 起動埌、数秒埌にFile->Pause Monitoringでトレヌスを停止したす。その埌以䞋の図のように、API Filter画面のDisplayをクリック、Add Filterをクリックするず、Display Filterダむアログがでるので、「Calling Module Name」を遞択肢、Azorultサンプルのファむル名ここではazorult.exeを入力しOK抌䞋。 するず、azorult.exeから呌び出されたAPIコヌルのみにフィルタできたす。サンプル起動盎埌のAPIコヌルは䞋図のように、 LoadLibraryA ず GetProcAddress によりマルりェアが呌び出したいAPIのアドレス解決をしおいるこずがわかりたす。これは、Windows仕様における 明瀺的リンク(Explicit Linking) の挙動です。ファむルヘッダの IAT(Import Address Table) に蚘茉され、衚局解析で容易にAPIを発芋な 暗黙的リンク(Implicit Linking) ずは察象的です。尚、IATは、Windows実行ファむルである PE 圢匏で定矩されるヘッダ情報です。 もう少し䞋にスクロヌルしおみるず、䞋図のように、なにやらWindowsバヌゞョン情報ず、 CreateMutexA でMutexが䜜られおいるこずがわかりたす。Mutexは2重起動等を防ぐため等に正芏アプリケヌションで甚いられたすが、マルりェアでも散芋される挙動です。 さらにスクロヌルしおみるず、䞋図のように、 wininet.dll がロヌドされ、むンタヌネット接続に関するAPI矀をアドレス解決しおいる様子を芋るこずができたす。 Fakenet-ngのログを芋るず、ドメむンcoronavirusstatus[.]spaceに察し101バむトの長さの通信を行っおいるこずがわかりたす。実際にはFakenet-ngが該圓ドメむンの暩嚁サヌバに代わり、DNS/HTTP疑䌌応答しおいるこずがログでわかりたす。尚、執筆時点で、該圓ドメむンのAレコヌド応答はありたせんでした。 Step.1 FridaによるCreateMutexAの远跡 前節のAPI Monitorによる解析で、Azorultサンプルは、動的に甚いるAPI関数のアドレス解決しおいたした。さらに、ハむフンにより繋がれた文字列でMutexを䜜り、あるドメむンに接続し101バむトの通信するこずがわかりたした。Fridaを䜿いCreateMutexAにフックをかけおみたす。FlareVMではfridaは導入されないので以䞋の様にむンストヌルしたす。 pip install frida-tools ここでは以䞋のコヌドを準備したした。Fridaでは、解析プロセスの立ち䞊げや解析スクリプトの適甚はpythonにより行いたすが、フック等を明瀺する解析スクリプト自䜓はJavaScriptにより蚘述したす。 Module のgetExportByNameにより、DLL名ずAPI名を指定しアドレスを埗た(1)あずで、 Interceptor のattachを甚い、指定アドレスをフックし、関数が呌ばれる前の凊理onEnter)、呌ばれたあずの凊理(onLeave)を蚘茉できたす。このように、フックしたあずで、ナヌザが任意のコヌドを実行させるこずがFridaの特城になりたす。ここでは、 CreateMutexA をフックし(2)、匕数の2番目のlpNameを衚瀺(3)するようにしたす。リンクからCreateMutexAのプロトタむプを確認できたす import frida import sys file = 'C: \\ work \\ frida \\ azorult.exe' pid = frida.spawn( file ) session = frida.attach(pid) script = session.create_script( """ console.log("Starting ...."); // CreateMutexAのアドレスを取埗 (1) var CreateMutexA = Module.getExportByName("kernel32.DLL", "CreateMutexA"); // 該圓アドレスでフック (2) Interceptor.attach(CreateMutexA, { // 関数が呌ばれる際に匕数を取埗し衚瀺 (3) onEnter: function (args) { console.log("Entering .... CreateMutexA"); console.log("[*] CreateMutexA args: " + args[2].readAnsiString()); }, }); """ ) script.load() frida.resume(pid) sys.stdin.read() 動䜜させるず以䞋のように、API Monitorで芋たMutexが䜜られおいるこずがわかりたす。 Step2. FridaによるMutex文字列生成ロゞック远跡 では、このハむフン区切りのMutex文字列はどのように生成されるのでしょうかAzorultを解析した blackberry瀟のブログ蚘事 によるず、䞋図のようなロゞックで生成されるずありたす。感染Windows端末における GUID 、プロダクト名、ナヌザ名、コンピュヌタ名を入力ずしお、ある関数(図ではID generate func())でByteの固定長に倉換され、それがハむフンで繋がれMutex文字列になっおいるこずがわかりたす。 匕甚元 https://blogs.blackberry.com/en/2019/06/threat-spotlight-analyzing-azorult-infostealer-malware この関数以䞋、笊号化関数ず呌びたすをデバッガを甚い確認しおみたしょう。Azorultサンプルは32bitバむナリですので、x32dbgを起動し、Azorultサンプルを開き、0x00406204にブレヌクポむントを蚭定したす。x32dbg巊䞋のコマンド窓から、bp 406204ず入力し゚ンタヌ抌䞋。ブレヌクポむント蚭定埌、実行F9キヌ抌䞋を数回起動するず、該圓アドレスで停止したす。数回が䜕回なのかは、x32dbgの「蚭定->Events」の蚭定によりたす。たた、ブレヌクポむントを過ぎおしたった堎合、Ctrl+F2キヌ抌䞋で開始時点からやり盎せたす。0x00406204のブレヌクポむントに到達したら、gキヌを抌䞋したす。するず以䞋のグラフ画面が衚瀺されたす。 0x00406204が笊号化関数の先頭になりたす。この笊号化関数は䜕床か呌ばれおおり、画面は、1回目の呌び出し時になりたす。1回目の笊号化察象はGUIDで、関数内のロヌカル倉数を意味する[ebp-4]にこのGUID文字列のポむンタが栌玍されおいるのがわかりたす。真ん䞭のブロックで、xor挔算やシフト挔算(shl,shr)が含たれ、ルヌプにより繰り返し回実行されるこずがわかりたす。繰り返しは察象文字列の先頭から末尟たで続きたす。特に興味深いのが、xorで固定の倀(ここでは0x6521458a)が䜿われおいるこずです。このサンプルはこの倀をキヌずしお、笊号化凊理をしおいるこずがわかりたす。こういった文字列は IOC ずしお掻甚できる可胜性がありたす。 笊号化関数のアドレスが確認できたので、Fridaで関数をフックしおみたす。先皋のコヌドに以䞋を远加したす。先皋のようにAPIではなく任意のアドレスでフックさせたい堎合は、 NativePointer を甚いポむンタを䜜っおおきたす(4),(6)。笊号化関数の入力倀に぀いおは、eaxレゞスタに文字列ぞのポむンタが入っおいるので、this.context.[レゞスタ名]で読み取り、 Memory.readAnsiString でポむンタの瀺す文字列を取埗したす(5)。笊号化関数の出力倀はebxレゞスタに栌玍されるので、同様にthis.context.ebxで倀そのものを取埗したす(7)。 // 埩号化関数開始アドレスのフック甚ポむンタ䜜成 ( 4 ) var enc_func_start = new NativePointer( "0x00406204" ) Interceptor.attach(enc_func_start, { onEnter: function (args) { console.log( "entering .... Encode_function" ); // eaxレゞスタの倀の瀺す文字列取埗 ( 5 ) console.log( "[*] Input_value : " + Memory.readAnsiString(this.context.eax)); }, }); // 埩号化関数終了アドレスのフック甚ポむンタ䜜成 ( 6 ) var enc_func_end = new NativePointer( "0x00406265" ) Interceptor.attach(enc_func_end, { onEnter: function (args) { //console.log( "exiting .... Encode_function" ); // ebxレゞスタの倀取埗 ( 7 ) console.log( "[*] Output_value : " + this.context.ebx); }, }); 䞊蚘コヌドの実行結果は以䞋のようになりたす。 GUID 、プロダクト名、ナヌザ名、コンピュヌタ名、及び前述4぀を぀なげた文字列、の蚈個が順番に、Input_valueずしお笊号化がされお、4Byteの文字列がOutput_valueずしお生成されおいるのがわかりたす。最終的にハむフンを挿入されおMutexが䜜られおいたす。 Step.3 FridaによるGetComputerNameW結果の曞き換え 最埌に、Fridaを甚い、マルりェアに誀った情報を䌝える䞀䟋ずしお、 GetComputerNameW の結果を曞き換えおみたす。前節たでの分析でみたように、本Azorultサンプルは、コンピュヌタ名等を甚いMutexを䜜り、それをHTTP通信によりビヌコンずしおC2に送りたす。䞀般に、C2偎ではこの情報をデコヌドしお感染端末情報を入手するこずで、タヌゲットか吊かを刀断し、情報搟取等次の行動に移りたす。 ここでは以䞋のコヌドを準備したした。Step.1ず同様に、 Module のgetExportByNameで、DLL名ずAPI名を指定しアドレスを埗た(8)あず、 Interceptor のattachで、指定アドレスをフックしたす。関数の呌ばれたあずの凊理(onLeave)を蚘茉しおいきたす。たず、曞き換え察象の文字列を Memory .allocでUTF16ずしおメモリを確保し倉数stに割り圓おたす(10)。次に、GetComputerNameWにより埗られたコンピュヌタ名の栌玍アドレスを確認しおいくのですが、ここで問題発生したした。GetComputerNameWのLeave時に、コンピュヌタ名を栌玍したメモリアドレスは、[ESP-8]ず想定したのですが、そこにはありたせんでした。そこで、 Memory .readByteArrayを甚いESPから100Byteダンプしたす(11)。するず[ESP+8]にコンピュヌタ名の存圚が確認できるので、このアドレスを曞き換え察象ずしおフック甚のポむンタを䜜成したす(12)。 Memory .copyで、先皋甚意した、倉数stに曞き換えたす(13)。曞き換わった埌のメモリを衚瀺するず確かに「NTTcom8213」にコンピュヌタ名が倉わっおいるこずを確認できたす。 import frida import sys file = 'C: \\ work \\ frida \\ azorult.exe' pid = frida.spawn( file ) session = frida.attach(pid) script = session.create_script( """ console.log("Starting ...."); // GetComputerNameWのアドレスを埗る (8) var gcExportAddress = Module.getExportByName("kernel32.DLL", "GetComputerNameW"); // フック蚭定 (9) Interceptor.attach(gcExportAddress, { onEnter: function (args) { console.log("Entering .... GetComputerNameW"); }, onLeave: function (retval) { console.log("Leaving .... GetComputerNameW"); // 曞き換え文字列のメモリ確保 (10) var st=Memory.allocUtf16String("NTTcom8213"); // espを起点にメモリダンプ (11) var esp = this.context.esp; var pointer = new NativePointer(esp); var mem = Memory.readByteArray(pointer, 100); console.log("Stack memory dump ... ESP: " + esp); console.log(mem); console.log("[*] Return Value exists ESP + 8"); // esp+8のアドレスを取埗しポむンタ䜜成 (12) esp = parseInt(esp) + 8; var pointer = new NativePointer(esp); console.log("[*] Original Return Value: " + Memory.readUtf16String(pointer)); // 曞き換え実斜 (13) Memory.copy(pointer, st, 22); console.log("[*] Altered Return Value: " + Memory.readUtf16String(pointer)); } }); var CreateMutexA = Module.getExportByName("kernel32.DLL", "CreateMutexA"); Interceptor.attach(CreateMutexA, { onEnter: function (args) { console.log("entering .... CreateMutexA"); console.log("[*] CreateMutexA arg: " + args[2].readAnsiString()); }, }); """ ) script.load() frida.resume(pid) sys.stdin.read() 本スクリプトの動䜜結果は以䞋になりたす。GetComputerNameWの結果をフックにより曞き換え、Mutex文字列における、コンピュヌタ名から生成される、埌半2぀のブロックの文字列の倉曎を確認できたした。AzorultのC2偎ではこの文字列を逆のロゞックでデコヌドし、コンピュヌタ名を埗るので、NTTcom8213ずいう誀った情報を䞎えるこずができたした。 補足 今回Fridaを怜蚌しおみお、気づいた点を曞いおおきたす。 アドレスによりフックが倱敗するケヌスあり Step.2の怜蚌では、WindowsAPIではなく、任意のアドレスをNativePointerにしおフックを仕掛けたした。アドレスによっおはクラッシュや゚ラヌメッセヌゞが出お、远跡察象のプログラムが正しく動䜜しなくなるケヌスがありたした。 異なる構文や工倫をしおフックを詊みたしたが、断念したした。おそらくデバッガのブレヌクポむントず同じ様に、停止させたいメモリアドレスに察しInt3呜什(0xCC)に眮き換えるこずで、実珟しおいるず思ったので䜕かしらやりようがあるず思いたしたが Interceptor.attachのonLeave動䜜仕様の正しい理解 Step.3怜蚌で、想定したメモリアドレスずずれおいたこずを述べたしたが、OnLeaveの仕様を私がちゃんず理解できおいないず思われたす。私の想定では、onEnterで関数の頭、onLeaveで関数のRETもしくはRET埌の想定だったのですが、それぞれ EIP を衚瀺させるず、OnLeaveに関しおもOnEnterず同䞀の関数冒頭のアドレスでした。(぀たりRet時にthis.context.[レゞスタ]で想定した倀が取れない) NativeFunction を甚い関数を定矩するこずでうたく行かないかなず詊したしたが、珟状で解決策が芋぀かっおいたせん。 サンプルAzorult怜䜓は、API MonitorのFakenet-ngログで芋たように、HTTP POST通信により、Mutexに登録したナヌザ情報を゚ンコヌドしおC2サヌバぞの送信を詊みるこずがわかりたした。この際、先皋の笊号化関数の凊理に加えお、さらに3Byteの別のxorキヌで、あるロゞックにより難読化を行い最終的なPOSTデヌタを生成したす。たた、感染埌はビヌコン以倖のC2通信も芳枬できたす。興味のある方は、該圓キヌやロゞック等さらなる解明に挑戊しおみおください。 今回甚いたサンプルAzorultのsha256 fda64c0ac9be3d10c28035d12ac0f63d85bb0733e78fe634a51474c83d0a0df8 終わりに いかがだったでしょうか。今回はFridaを䜿いマルりェアの動䜜を解析し、誀った情報を䞎えるこずを行いたした。ちょっずした動䜜の倉曎であればデバッガ䞊で可胜ですが、任意のコヌド実行を含む倧きな倉曎を䌎う堎合などは、動的バむナリ蚈装の恩恵は倧きくなりたす。実は圓初、最近勢いがある゚ミュレヌタヌ Qiling で同様の解析を行う぀もりで怜蚌をしおいたのですが、䞊蚘補足に曞いた以䞊にむンパクトのある問題が出お、今回の目暙だず適さないこずがわかったので急遜本怜蚌に倉曎したした。マルりェア解析では垞に2぀以䞊のツヌルを甚意するのが王道ず蚀われたすが、その必芁性を実感したした。Qilingに぀いおも機䌚がありたしたら玹介したいず思いたす。 それでは、明日の蚘事もお楜しみに
この蚘事は NTTコミュニケヌションズ Advent Calendar 2021 の19日目の蚘事です。 はじめに こんにちは。むノベヌションセンタヌテクノロゞヌ郚門の田䞭ず申したす。むンタヌネットにおける攻撃むンフラ撲滅に向けた远跡掻動を䞻に行っおいたす。䟋えば、远跡䞭のIPアドレスは真に該圓マルりェアのC2であるか、珟圚も掻動䞭であるか等を OSINT を掻甚しお粟床を䞊げお特定しおいくのですが、さらに情報が必芁になるケヌスがありたす。その際に、有力な技術の1぀になるのが、マルりェアやC2に䞎える情報を制埡し、挙動の差異を芳枬するずいう手法です。本蚘事では、 Frida ずいうツヌルを利甚しお、解析・倉曎の初歩の郚分に぀いお行っおみたいず思いたす。 抂芁 前半は、準備ずしお API Monitor ずいうツヌルを甚い、APIコヌルをトレヌスし、マルりェアの挙動を簡単に把握したす。埌半は、動的バむナリ蚈装(DBI:Dynamic Binary Instrumentation)フレヌムワヌクの1぀である Frida を䜿っおマルりェアの䞀郚の動䜜をフックし、その動䜜を倉曎しおみたす。DBIは、実行䞭のプログラムにコヌドを挿入可胜な技術で、関数をフックしお入出力の読み取り・曞き換えするこずが可胜ずなりたす。API Monitorはマルりェア解析トレヌニングコヌスである SANS FOR610 でも扱われたすが抂芁にずどたるのず、Fridaは、マルりェア解析適甚事䟋が少ないため、今回玹介するこずにしたした。 解析環境の準備 マルりェアを動䜜させお解析するため、専甚の仮想環境を準備したす。VirtualBoxやVMware等䞊にWindows10をセットアップし、解析ツヌルを準備したす。今回は、デバッガ x64dbg 、 API Monitor 、ネットワヌクツヌル Fakenet-ng を甚いたす。各サむトからダりンロヌドしおむンストヌルしおください。解析ツヌルを䞀括導入しおくれる FlareVM を甚いるのもお勧めです。仮想環境を構築したらスナップショットを取埗し、マルりェア解析埌は、元の状態ぞ戻すようにしおください。尚、Fridaに぀いおは埌半で導入方法から玹介したす。 解析怜䜓 今回は、 Azorult ずいうマルりェアを察象にしたす。 Anyrun から入手したサンプルを䜿甚したす Azorultサンプル解析ペヌゞ 。Azorultサンプルの 解析ペヌゞ を確認しお頂くずわかるように、このAzorultサンプルは、コロナ感染状況パネルを暡擬したドロッパヌから、プロセスID:2636でドロップされたものです。ドロッパヌはAzorultではないのでご泚意ください API Monitorによる簡易解析 準備した解析環境で、Azorultサンプルを解析しおいきたす。たず、Fakenet-ngを起動したす。Fakenet-ngはダミヌのDNSサヌバやWebサヌバ盞圓の動䜜をロヌカル環境で担っおくれ、マルりェアのC2等の通信を仮想環境内に閉じ蟌めおくれたす。 次に、API Monitorを甚いおサンプルを起動しおAPIコヌルをトレヌスしたす。API Monitorは2013幎に開発が止たっおいたすが、有益なツヌルなので䜿い方の䞀郚を解説したす。API Monitor(x86)を起動埌、File->Monitor New Processで、Azorultのサンプルを遞択したす。遞択画面で、exeファむルのみしか遞択できない仕様のため、Azorultサンプルの拡匵子が異なる堎合は、exeに倉曎しおください。サンプルを遞択しOK抌䞋するず、Azorultが起動され、以䞋のように呌び出されたAPIが蚘録されたす。 起動埌、数秒埌にFile->Pause Monitoringでトレヌスを停止したす。その埌以䞋の図のように、API Filter画面のDisplayをクリック、Add Filterをクリックするず、Display Filterダむアログがでるので、「Calling Module Name」を遞択肢、Azorultサンプルのファむル名ここではazorult.exeを入力しOK抌䞋。 するず、azorult.exeから呌び出されたAPIコヌルのみにフィルタできたす。サンプル起動盎埌のAPIコヌルは䞋図のように、 LoadLibraryA ず GetProcAddress によりマルりェアが呌び出したいAPIのアドレス解決をしおいるこずがわかりたす。これは、Windows仕様における 明瀺的リンク(Explicit Linking) の挙動です。ファむルヘッダの IAT(Import Address Table) に蚘茉され、衚局解析で容易にAPIを発芋な 暗黙的リンク(Implicit Linking) ずは察象的です。尚、IATは、Windows実行ファむルである PE 圢匏で定矩されるヘッダ情報です。 もう少し䞋にスクロヌルしおみるず、䞋図のように、なにやらWindowsバヌゞョン情報ず、 CreateMutexA でMutexが䜜られおいるこずがわかりたす。Mutexは2重起動等を防ぐため等に正芏アプリケヌションで甚いられたすが、マルりェアでも散芋される挙動です。 さらにスクロヌルしおみるず、䞋図のように、 wininet.dll がロヌドされ、むンタヌネット接続に関するAPI矀をアドレス解決しおいる様子を芋るこずができたす。 Fakenet-ngのログを芋るず、ドメむンcoronavirusstatus[.]spaceに察し101バむトの長さの通信を行っおいるこずがわかりたす。実際にはFakenet-ngが該圓ドメむンの暩嚁サヌバに代わり、DNS/HTTP疑䌌応答しおいるこずがログでわかりたす。尚、執筆時点で、該圓ドメむンのAレコヌド応答はありたせんでした。 Step.1 FridaによるCreateMutexAの远跡 前節のAPI Monitorによる解析で、Azorultサンプルは、動的に甚いるAPI関数のアドレス解決しおいたした。さらに、ハむフンにより繋がれた文字列でMutexを䜜り、あるドメむンに接続し101バむトの通信するこずがわかりたした。Fridaを䜿いCreateMutexAにフックをかけおみたす。FlareVMではfridaは導入されないので以䞋の様にむンストヌルしたす。 pip install frida-tools ここでは以䞋のコヌドを準備したした。Fridaでは、解析プロセスの立ち䞊げや解析スクリプトの適甚はpythonにより行いたすが、フック等を明瀺する解析スクリプト自䜓はJavaScriptにより蚘述したす。 Module のgetExportByNameにより、DLL名ずAPI名を指定しアドレスを埗た(1)あずで、 Interceptor のattachを甚い、指定アドレスをフックし、関数が呌ばれる前の凊理onEnter)、呌ばれたあずの凊理(onLeave)を蚘茉できたす。このように、フックしたあずで、ナヌザが任意のコヌドを実行させるこずがFridaの特城になりたす。ここでは、 CreateMutexA をフックし(2)、匕数の2番目のlpNameを衚瀺(3)するようにしたす。リンクからCreateMutexAのプロトタむプを確認できたす import frida import sys file = 'C: \\ work \\ frida \\ azorult.exe' pid = frida.spawn( file ) session = frida.attach(pid) script = session.create_script( """ console.log("Starting ...."); // CreateMutexAのアドレスを取埗 (1) var CreateMutexA = Module.getExportByName("kernel32.DLL", "CreateMutexA"); // 該圓アドレスでフック (2) Interceptor.attach(CreateMutexA, { // 関数が呌ばれる際に匕数を取埗し衚瀺 (3) onEnter: function (args) { console.log("Entering .... CreateMutexA"); console.log("[*] CreateMutexA args: " + args[2].readAnsiString()); }, }); """ ) script.load() frida.resume(pid) sys.stdin.read() 動䜜させるず以䞋のように、API Monitorで芋たMutexが䜜られおいるこずがわかりたす。 Step2. FridaによるMutex文字列生成ロゞック远跡 では、このハむフン区切りのMutex文字列はどのように生成されるのでしょうかAzorultを解析した blackberry瀟のブログ蚘事 によるず、䞋図のようなロゞックで生成されるずありたす。感染Windows端末における GUID 、プロダクト名、ナヌザ名、コンピュヌタ名を入力ずしお、ある関数(図ではID generate func())でByteの固定長に倉換され、それがハむフンで繋がれMutex文字列になっおいるこずがわかりたす。 匕甚元 https://blogs.blackberry.com/en/2019/06/threat-spotlight-analyzing-azorult-infostealer-malware この関数以䞋、笊号化関数ず呌びたすをデバッガを甚い確認しおみたしょう。Azorultサンプルは32bitバむナリですので、x32dbgを起動し、Azorultサンプルを開き、0x00406204にブレヌクポむントを蚭定したす。x32dbg巊䞋のコマンド窓から、bp 406204ず入力し゚ンタヌ抌䞋。ブレヌクポむント蚭定埌、実行F9キヌ抌䞋を数回起動するず、該圓アドレスで停止したす。数回が䜕回なのかは、x32dbgの「蚭定->Events」の蚭定によりたす。たた、ブレヌクポむントを過ぎおしたった堎合、Ctrl+F2キヌ抌䞋で開始時点からやり盎せたす。0x00406204のブレヌクポむントに到達したら、gキヌを抌䞋したす。するず以䞋のグラフ画面が衚瀺されたす。 0x00406204が笊号化関数の先頭になりたす。この笊号化関数は䜕床か呌ばれおおり、画面は、1回目の呌び出し時になりたす。1回目の笊号化察象はGUIDで、関数内のロヌカル倉数を意味する[ebp-4]にこのGUID文字列のポむンタが栌玍されおいるのがわかりたす。真ん䞭のブロックで、xor挔算やシフト挔算(shl,shr)が含たれ、ルヌプにより繰り返し回実行されるこずがわかりたす。繰り返しは察象文字列の先頭から末尟たで続きたす。特に興味深いのが、xorで固定の倀(ここでは0x6521458a)が䜿われおいるこずです。このサンプルはこの倀をキヌずしお、笊号化凊理をしおいるこずがわかりたす。こういった文字列は IOC ずしお掻甚できる可胜性がありたす。 笊号化関数のアドレスが確認できたので、Fridaで関数をフックしおみたす。先皋のコヌドに以䞋を远加したす。先皋のようにAPIではなく任意のアドレスでフックさせたい堎合は、 NativePointer を甚いポむンタを䜜っおおきたす(4),(6)。笊号化関数の入力倀に぀いおは、eaxレゞスタに文字列ぞのポむンタが入っおいるので、this.context.[レゞスタ名]で読み取り、 Memory.readAnsiString でポむンタの瀺す文字列を取埗したす(5)。笊号化関数の出力倀はebxレゞスタに栌玍されるので、同様にthis.context.ebxで倀そのものを取埗したす(7)。 // 埩号化関数開始アドレスのフック甚ポむンタ䜜成 ( 4 ) var enc_func_start = new NativePointer( "0x00406204" ) Interceptor.attach(enc_func_start, { onEnter: function (args) { console.log( "entering .... Encode_function" ); // eaxレゞスタの倀の瀺す文字列取埗 ( 5 ) console.log( "[*] Input_value : " + Memory.readAnsiString(this.context.eax)); }, }); // 埩号化関数終了アドレスのフック甚ポむンタ䜜成 ( 6 ) var enc_func_end = new NativePointer( "0x00406265" ) Interceptor.attach(enc_func_end, { onEnter: function (args) { //console.log( "exiting .... Encode_function" ); // ebxレゞスタの倀取埗 ( 7 ) console.log( "[*] Output_value : " + this.context.ebx); }, }); 䞊蚘コヌドの実行結果は以䞋のようになりたす。 GUID 、プロダクト名、ナヌザ名、コンピュヌタ名、及び前述4぀を぀なげた文字列、の蚈個が順番に、Input_valueずしお笊号化がされお、4Byteの文字列がOutput_valueずしお生成されおいるのがわかりたす。最終的にハむフンを挿入されおMutexが䜜られおいたす。 Step.3 FridaによるGetComputerNameW結果の曞き換え 最埌に、Fridaを甚い、マルりェアに誀った情報を䌝える䞀䟋ずしお、 GetComputerNameW の結果を曞き換えおみたす。前節たでの分析でみたように、本Azorultサンプルは、コンピュヌタ名等を甚いMutexを䜜り、それをHTTP通信によりビヌコンずしおC2に送りたす。䞀般に、C2偎ではこの情報をデコヌドしお感染端末情報を入手するこずで、タヌゲットか吊かを刀断し、情報搟取等次の行動に移りたす。 ここでは以䞋のコヌドを準備したした。Step.1ず同様に、 Module のgetExportByNameで、DLL名ずAPI名を指定しアドレスを埗た(8)あず、 Interceptor のattachで、指定アドレスをフックしたす。関数の呌ばれたあずの凊理(onLeave)を蚘茉しおいきたす。たず、曞き換え察象の文字列を Memory .allocでUTF16ずしおメモリを確保し倉数stに割り圓おたす(10)。次に、GetComputerNameWにより埗られたコンピュヌタ名の栌玍アドレスを確認しおいくのですが、ここで問題発生したした。GetComputerNameWのLeave時に、コンピュヌタ名を栌玍したメモリアドレスは、[ESP-8]ず想定したのですが、そこにはありたせんでした。そこで、 Memory .readByteArrayを甚いESPから100Byteダンプしたす(11)。するず[ESP+8]にコンピュヌタ名の存圚が確認できるので、このアドレスを曞き換え察象ずしおフック甚のポむンタを䜜成したす(12)。 Memory .copyで、先皋甚意した、倉数stに曞き換えたす(13)。曞き換わった埌のメモリを衚瀺するず確かに「NTTcom8213」にコンピュヌタ名が倉わっおいるこずを確認できたす。 import frida import sys file = 'C: \\ work \\ frida \\ azorult.exe' pid = frida.spawn( file ) session = frida.attach(pid) script = session.create_script( """ console.log("Starting ...."); // GetComputerNameWのアドレスを埗る (8) var gcExportAddress = Module.getExportByName("kernel32.DLL", "GetComputerNameW"); // フック蚭定 (9) Interceptor.attach(gcExportAddress, { onEnter: function (args) { console.log("Entering .... GetComputerNameW"); }, onLeave: function (retval) { console.log("Leaving .... GetComputerNameW"); // 曞き換え文字列のメモリ確保 (10) var st=Memory.allocUtf16String("NTTcom8213"); // espを起点にメモリダンプ (11) var esp = this.context.esp; var pointer = new NativePointer(esp); var mem = Memory.readByteArray(pointer, 100); console.log("Stack memory dump ... ESP: " + esp); console.log(mem); console.log("[*] Return Value exists ESP + 8"); // esp+8のアドレスを取埗しポむンタ䜜成 (12) esp = parseInt(esp) + 8; var pointer = new NativePointer(esp); console.log("[*] Original Return Value: " + Memory.readUtf16String(pointer)); // 曞き換え実斜 (13) Memory.copy(pointer, st, 22); console.log("[*] Altered Return Value: " + Memory.readUtf16String(pointer)); } }); var CreateMutexA = Module.getExportByName("kernel32.DLL", "CreateMutexA"); Interceptor.attach(CreateMutexA, { onEnter: function (args) { console.log("entering .... CreateMutexA"); console.log("[*] CreateMutexA arg: " + args[2].readAnsiString()); }, }); """ ) script.load() frida.resume(pid) sys.stdin.read() 本スクリプトの動䜜結果は以䞋になりたす。GetComputerNameWの結果をフックにより曞き換え、Mutex文字列における、コンピュヌタ名から生成される、埌半2぀のブロックの文字列の倉曎を確認できたした。AzorultのC2偎ではこの文字列を逆のロゞックでデコヌドし、コンピュヌタ名を埗るので、NTTcom8213ずいう誀った情報を䞎えるこずができたした。 補足 今回Fridaを怜蚌しおみお、気づいた点を曞いおおきたす。 アドレスによりフックが倱敗するケヌスあり Step.2の怜蚌では、WindowsAPIではなく、任意のアドレスをNativePointerにしおフックを仕掛けたした。アドレスによっおはクラッシュや゚ラヌメッセヌゞが出お、远跡察象のプログラムが正しく動䜜しなくなるケヌスがありたした。 異なる構文や工倫をしおフックを詊みたしたが、断念したした。おそらくデバッガのブレヌクポむントず同じ様に、停止させたいメモリアドレスに察しInt3呜什(0xCC)に眮き換えるこずで、実珟しおいるず思ったので䜕かしらやりようがあるず思いたしたが Interceptor.attachのonLeave動䜜仕様の正しい理解 Step.3怜蚌で、想定したメモリアドレスずずれおいたこずを述べたしたが、OnLeaveの仕様を私がちゃんず理解できおいないず思われたす。私の想定では、onEnterで関数の頭、onLeaveで関数のRETもしくはRET埌の想定だったのですが、それぞれ EIP を衚瀺させるず、OnLeaveに関しおもOnEnterず同䞀の関数冒頭のアドレスでした。(぀たりRet時にthis.context.[レゞスタ]で想定した倀が取れない) NativeFunction を甚い関数を定矩するこずでうたく行かないかなず詊したしたが、珟状で解決策が芋぀かっおいたせん。 サンプルAzorult怜䜓は、API MonitorのFakenet-ngログで芋たように、HTTP POST通信により、Mutexに登録したナヌザ情報を゚ンコヌドしおC2サヌバぞの送信を詊みるこずがわかりたした。この際、先皋の笊号化関数の凊理に加えお、さらに3Byteの別のxorキヌで、あるロゞックにより難読化を行い最終的なPOSTデヌタを生成したす。たた、感染埌はビヌコン以倖のC2通信も芳枬できたす。興味のある方は、該圓キヌやロゞック等さらなる解明に挑戊しおみおください。 今回甚いたサンプルAzorultのsha256 fda64c0ac9be3d10c28035d12ac0f63d85bb0733e78fe634a51474c83d0a0df8 終わりに いかがだったでしょうか。今回はFridaを䜿いマルりェアの動䜜を解析し、誀った情報を䞎えるこずを行いたした。ちょっずした動䜜の倉曎であればデバッガ䞊で可胜ですが、任意のコヌド実行を含む倧きな倉曎を䌎う堎合などは、動的バむナリ蚈装の恩恵は倧きくなりたす。実は圓初、最近勢いがある゚ミュレヌタヌ Qiling で同様の解析を行う぀もりで怜蚌をしおいたのですが、䞊蚘補足に曞いた以䞊にむンパクトのある問題が出お、今回の目暙だず適さないこずがわかったので急遜本怜蚌に倉曎したした。マルりェア解析では垞に2぀以䞊のツヌルを甚意するのが王道ず蚀われたすが、その必芁性を実感したした。Qilingに぀いおも機䌚がありたしたら玹介したいず思いたす。 それでは、明日の蚘事もお楜しみに
この蚘事は NTTコミュニケヌションズ Advent Calendar 2021 18日目の蚘事です。 はじめに こんにちは、むノベヌションセンタヌの霋藀 暁です。普段はコンピュヌタビゞョンの技術開発やAI/MLシステムの怜蚌に取り組んでいたす。今回は、JetsonでJAXが䜿えるように環境の構築をしおいくのですが、時間の関係䞊ビルドたでたどり぀くこずができたせんでした。ただ、せっかくなので奮闘蚘ずしお、どのような方法で゚ラヌハンドリングしたかを残しおおきたいず思いたすので。自身ぞの戒めずいう偎面もありたすが、次にJetsonでJAXを䜿いたい人が、この方法はクリティカルな゚ラヌハンドリングではないんだずいうこずを知っおいただくこずが嬉しいです。 (JAXは勉匷したいず思っおいるので、ビルドがうたく行った際には、情報を曎新したいず考えおおりたすので、適宜のぞいおみおいただけるずビルドできた䟋を芋るこずができるかもしれないです。) JAXずは google/jaxから匕甚 たずJAXに぀いお軜く説明をしたいず思いたす。 JAXずはAutogradずXLAを組み合わせた機械孊習のラむブラリです。 特城的な点ずしおは、JAXがXLAを䜿っおGPUやTPU䞊でNumPyをコンパむルしお実行できるずころです。jitのデコレヌタによるコンパむルずgradによる自動埮分を組み合わせお䜿甚できたす。 今埌も新しい機胜がでるこずを明蚀しおいるこずから、今埌たすたす発展するラむブラリであるず思っおいたす。 モチベヌション 珟圚私は、Jetsonなどの゚ッゞデバむスを甚いた映像解析アプリケヌションの開発をしおいたす。この開発では、゚ッゞデバむスを含めたモデルの最適な配眮に぀いおも開発の課題ずしおおりたす。 高速に蚈算をできれば、よりリアルタむムに近い掚論をできる嬉しさがあるず考えられたす。ただ、JAXは2018幎にロヌンチされたラむブラリであるため、゚ッゞデバむスで利甚するこずに適しおいるのかずいう議論に぀いおもあたり数がないように思いたした。 そのため、今回はJAXをJetsonにそもそもむンストヌルし、䜿甚できるのかずいう郚分から怜蚌したいずモチベヌションがありたす。 環境構築 ※泚意: ただJetsonでJAXを䜿えるようにできおおりたせん。できた際には、この蚘事を曎新したいず思っおいたすが、䞋蚘の方法では私の環境ではビルドできないこずを確認しおいたす。 最初は、Jetson Xavier NXで環境構築を詊みたのですが、私の環境ではbuildの途䞭でメモリが溢れおしたいたした。もしかしたらSwap領域を増やせば、萜ちないかもしれないですが、今回はJetson AGX Xavierでビルドを行いたした。(Jetson Nanoでできたずいう蚘事がありたすが、Jetson Xavier NXでのビルドで萜ちおいたので、こちらもどこかでやりたいですね) Jetsonの環境 たず、Jetson環境の構築から始めたす。 今回私が䜿甚するJetsonのOSであるL4Tのバヌゞョンは、32.6.1。Jetpackのバヌゞョンは4.6を遞択したした。内郚ストレヌゞは、32GBしかないため、NvMeのSSD 256GBを増蚭したした。 bootFromExternalStorage の手順に埓っおJetPack4.6をNvMeから起動したす。以䞋に簡単にたずめたす。詳しい説明に぀いおは、githubに茉っおいるのでそちらの参照をお願いいたしたす。 # Ubuntu18.04 or Ubuntu20.04を入れたx86_64ベヌスのホストPCを甚意したす # git cloneでbootFromExternalStorageをむンストヌルしたす git clone https://github.com/jetsonhacks/bootFromExternalStorage.git cd bootFromExternalStorage . install_dependencies.sh . get_jetson_files.sh # JetsonずホストPCをUSBケヌブルで぀なぐ # このスクリプトがうたくいくず、Jetson AGX Xavierが起動する . flash_jetson_external_storage.sh # Jetson AGX Xavierに、bootFromExternalStorageをむンストヌルしたす # 以䞋のスクリプトを実行するこずによっおcuda、cudnnなどをむンストヌルできたす . install_jetson_default_packages.sh JAXの環境構築 .bashrcの䞀番䞋に以䞋を远加したす。 sudo vim ~/.bashrc export PATH=/usr/local/cuda/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} 次に以䞋のスクリプトを実行しおむンストヌルするずビルドが始たりたす。 source ~/.bashrc #PPAの远加 sudo add-apt-repository ppa:deadsnakes/ppa sudo apt update # 珟圚(2021.12.15)のJAXは、python3.6を実行環境から倖しおいるため、 # 今埌アップデヌトの際にサポヌトから倖れないように、python3.9を遞択したした sudo apt install python3.9 python3.9-dev sudo apt install python3-pip sudo pip3 install virtualenv virtualenv -p /usr/bin/python3.9 jax source ./jax/bin/activate sudo apt-get install python3.9-distutils #必芁なラむブラリのむンストヌル python -m pip install numpy scipy six wheel sudo apt install g++ #jaxのむンストヌル git clone https://github.com/google/jax cd jax python ./build/build.py おやおや...? 䜕か゚ラヌが出おたすね長い゚ラヌがでおいるので、ずりあえず怪しい郚分を抜粋しおみたす。 #゚ラヌ文 [2,118 / 5,712] Compiling llvm/lib/Target/X86/X86ISelLowering.cpp; 50s local ... (8 actions running) [2,155 / 5,712] Compiling llvm/lib/Target/X86/X86ISelLowering.cpp; 216s local ... (8 actions running) ERROR: /home/hoge/.cache/bazel/_bazel_nvidia/a5643b5cc286b9b13a96818003a4a7dd/external/org_tensorflow/tensorflow/python/lib/core/BUILD:49:11: Compiling tensorflow/python/lib/core/bfloat16.cc failed: (Exit 1): gcc failed: error executing command (cd /home/hoge/.cache/bazel/_bazel_nvidia/a5643b5cc286b9b13a96818003a4a7dd/execroot/__main__ ... JetsonのCPUのアヌキテクチャはARM64ですが、X86のllvmをコンパむルしおいたすね。ですので、ずりあえずarmのllvm䞀匏をむンストヌルしたす。 sudo apt-get -y install libllvm-7-ocaml-dev libllvm7 llvm-7 llvm-7-dev llvm-7-doc llvm-7-examples llvm-7-runtime ゚ラヌ文は倉わっおたすね、今床は /.cache/bazel のパヌミッションがないのか? #゚ラヌ文 ERROR: /home/nvidia/.cache/bazel/_bazel_nvidia/a5643b5cc286b9b13a96818003a4a7dd/external/llvm-project/llvm/BUILD.bazel:2068:11: Compiling llvm/lib/Passes/PassBuilder.cpp failed: (Exit 4): gcc failed: error executing command ずりあえず、パヌミッションをこのコマンドで倉えおみたす。 sudo chmod -R u+rw ~/.cache/bazel/ ゚ラヌが止たらない..。 次にできるこずずしお、JetPackを䜿うず感じるこずが、ラむブラリのバヌゞョンによっお動く動かないがあるので、bazelのバヌゞョンによる問題ではないかず仮定したした。 珟圚のJAXのbranchのbazelのバヌゞョンは、4.2.1です。しかし、bazelのpreinstallができるバヌゞョンを芋おいるずbazel4.2.1は、JetPack4.6.1に察応しおいないのかなず思われたす。そのため、今回はJAXの最新バヌゞョンを䜿うのではなく、bazel3.7.2がビルドされるバヌゞョンを䜿甚しおみたす。 #bazel3.7.2 䞔぀armに察応しおいるtagの遞択 git checkout -b jax-v0.2.17 # .cache/bazel/ のパヌミッション系の問題が起きないように sudo chmod -R u+rw ~/.cache/bazel/ python ./build/build.py うヌん。さっきず゚ラヌが倉わっおいないような気がしたす。 numpyのバヌゞョンずいう線もあるので、䞀応numpy1.21.4から䞋げおビルドをしおみたしたが、゚ラヌは倉わらず..。 #゚ラヌ文 ERROR: /home/nvidia/.cache/bazel/_bazel_nvidia/f136147ae544c503f5fd3870723c0471/external/org_tensorflow/tensorflow/compiler/xla/service/cpu/BUILD:393:11: C++ compilation of rule '@org_tensorflow//tensorflow/compiler/xla/service/cpu:ir_emitter' failed (Exit 4): gcc failed: error executing command ここで、タむムアップずなっおしたいたした。他にも现々ずやったのですが、䞻にやったこずが以䞊ずなっおいたす。 所感 JetsonでJAXの環境構築にチャレンゞしたのですが、冬䌑みの課題ずなりたした。JAXで遊ぶこずは今回達成できたせんでしたが、䞭で䜕がコンパむルされおいるのか芋るこずはできたので、良い勉匷になったかず思われたす。たた、この方法でやれば良いのではずいう情報を共有しおくださる方がおりたしたら str.saitontt.com たで教えおいただけるず嬉しいです。 おわりに 今回は、JAXをJetson AGX Xavierで環境構築をしたかったのですが、ただこれをすれば確実にビルドできる!ずいう方法がなく1週間ほどでは難しかったです。そのため、ずりあえずビルドをするこずが今埌の課題ずなりそうです。 そしお今埌は、JAXを䜿っお物䜓怜出のモデルを曞いおみたいず思っおいるので、その際にベンチマヌクを枬れればいいなず思いたす。(幎末幎始にチャレンゞしおみたい) それでは、明日の蚘事もお楜しみに 参考 @software{jax2018github, author = {James Bradbury and Roy Frostig and Peter Hawkins and Matthew James Johnson and Chris Leary and Dougal Maclaurin and George Necula and Adam Paszke and Jake Vander{P}las and Skye Wanderman-{M}ilne and Qiao Zhang}, title = {{JAX}: composable transformations of {P}ython+{N}um{P}y programs}, url = {http://github.com/google/jax}, version = {0.2.5}, year = {2018}, }
この蚘事は NTTコミュニケヌションズ Advent Calendar 2021 の17日目の蚘事です。 はじめに こんにちは。プラットフォヌムサヌビス本郚 デヌタプラットフォヌムサヌビス郚でSmart Data Platform(SDPF)のサヌビス䌁画を行っおいる安井・小野です。 閲芧頂きありがずうございたす。我々は圓瀟が提䟛しおいるSDPFサヌビスを組合わせた具䜓的な事䟋玹介をしおおりたす。 前回、 第1回目 では、いく぀かの組み合わせ事䟋をご玹介したした。 今幎を振り返っおみるず、コロナ犍による圚宅勀務が掚進され、テレワヌクが倧々的に進み、今ではオンラむンミヌティングツヌル(Microsoft Teams等)は必芁䞍可欠なツヌルずなりたした。 たた、オンラむン利甚が広がる䞭、サむバヌ攻撃を受けるリスクもこれたでよりも高たっおおり、ランサムりェアの被害が瀟䌚問題にもなっおきおいたす。 SDPFサヌビス矀の組合せ事䟋の第2回目の玹介ずしお、「オンラむンツヌル含むMicrosoft瀟のMicrosoft 365のデヌタを安党にランサムりェア察策をしおバックアップする」ナヌスケヌスに぀いお、 SDPF䞊でどのように実珟するのか、怜蚌確認した結果に぀いおご玹介させおいただきたす。 背景 Microsoft 365などのSaaSサヌビスがビゞネスツヌルずしお利甚が進む ビゞネスツヌルずしおMicrosoft 365の利甚拡倧は進んでおり、特にコロナ犍でのワヌクスタむル倉革やテレワヌクの定着化でMicrosoft Teamsをオンラむンツヌルずしお利甚が増々進みたした。 このようなビゞネス䞊でやり取りする重芁なデヌタはSaaS/クラりド䞊に存圚し、Microsoftの暙準の機胜でもバックアップしおいたすが、最終的にはデヌタ保護/管理責任はナヌザヌ偎にありたす。 そのため、人為ミス察策や退職者デヌタの埩旧等に備え、Microsoftもナヌザヌ自身でのバックアップを掚奚しおいたす。 ランサムりェア被害が広がり重芁デヌタの暗号化等の被害が発生 ナヌザヌ自身がデヌタ消倱のリスク(システム障害、故意/䞍意のデヌタ削陀等)に備えおバックアップを取埗したすが、昚今の情勢から、もう1぀の芳点で重芁な察策を実斜する必芁がありたす。 それがランサムりェア察策です。 譊察庁での広報資料(p13) では、脆匱性の探玢行為等に関する芳枬状況に぀いお蚘茉されおおり、脅嚁が増加傟向にあるこずが確認できたす。 実際にランサムりェア被害は瀟䌚的な問題にもなり、医療機関にも広がる䞭、 厚生劎働省はサむバヌ攻撃察策のガむドラむン を瀺しおいたす。 ランサムりェア攻撃ぞの察策ずしおネットワヌクの境界察策や゚ンドポむントでの防埡策を講じお感染を回避する入口察策の実斜や、感染の怜知ず察応の事埌察策をする䜓制構築が必芁です。 䞊蚘を行った䞊でも実際の被害の発生が続いおおりたす。今日では「ランサムりェアに感染した堎合でも速やかに埩旧できるよう、 デヌタの䞊曞きや改ざんを防止したバックアップを取埗しおおき、デヌタ暗号化やデヌタ消倱、金銭的な被害を抑える察策を実斜する」ずいう考え方が広たりたした。 SDPFサヌビスを利甚しおどのように実珟したか 以降に詳现を蚘茉したすが、NTT Comの各皮サヌビスを組み合わせお実珟しおみたした。 閉域網(Arcster Universal One)から各皮クラりドサヌビスに接続するむンタヌコネクトサヌビス(Flexible InterConnect)を䜿ったセキュアな通信経路の確立 安䟡なストレヌゞサヌビス(Wasabiオブゞェクトストレヌゞ)を䜿い、か぀デヌタ䞊曞き/改ざんを防止するオブゞェクトロック機胜を䜿ったランサムりェア察策の実斜 クラりド偎の制限に瞛られず、オンプレミス環境ず同等のサヌビスレベルを実珟するバックアップツヌル(Arcserve UDP)の利甚 䞊蚘をお客様自身やSIerの方々で組み䞊げられるこずを実際に怜蚌しお確認 怜蚌を通じた確認 実際に怜蚌環境を䜜っおみた Flexible InterConnect (FIC) を掻甚するこずにより、 Wasabiオブゞェクトストレヌゞ(Wasabi) やMicrosoft 365等様々なサヌビスず閉域で接続可胜。 Arcserve UDP はSDPFクラりド/サヌバヌのサヌバヌむンスタンス䞊に導入。 実際に怜蚌を実斜しおみた ①閉域網を掻甚したMicrosoft 365デヌタのバックアップずリストア Arcserve UDPを甚いお、Microsoft 365の各サヌビス Microsoft Exchange Online (Exchange Online)、Microsoft SharePoint Online (SharePoint Online)、Microsoft OneDrive (OneDrive)、Microsoft Teams (Teams)のバックアップデヌタを、 FIC経由でWasabiに保存、Microsoft 365やロヌカルストレヌゞぞリストアを行う怜蚌をしたした。 ②クラりドストレヌゞのランサムりェア察策機胜の掻甚 Wasabiに保存したバックアップに察しお、Arcserve UDPの2次コピヌ(埩旧ポむントのコピヌ) 機胜を掻甚し、 Arcserve UDP 8.1からの新機胜ずしお遞択可胜ずなったオブゞェクトロックが有効化されたWasabiを埩旧ポむントのコピヌ先ずしお指定するこずにより、 指定期間䞭、埩旧ポむントのデヌタを安党に保持できるか怜蚌したした。 確認埌の具䜓的な気づきポむント 「①閉域網を掻甚したMicrosoft 365デヌタのバックアップずリストア」では、Microsoft 365の仕様䞊、Teamsのリストアに関しお少しテクニックが必芁でした。 䟋えば、1察1のチャットやチャネル(グルヌプ)のチャットを元の堎所にリストアしたいずなった堎合、リストアしおもTeams䞊にはリストアされたせんでした。 確認する際は、Exchange Onlineからのリストアのため、Outlookにお確認する必芁がありたした。 そしお、チャネル(グルヌプ)のチャットに関しおはチャネル(グルヌプ)に関連づいおいるメヌルアドレスが特定のメヌルボックスを持たない仕様ずなりたす。 そのため、チャネル(グルヌプ)のチャットをリストアしお確認したい堎合は、別の堎所ぞのリストアでリストア先に個人のアカりントを指定し、そのアカりントのOutlookにお確認する必芁がありたした。 このように、Microsoft 365の仕様䞊、䞊蚘のような確認方法ずなるサヌビスもありたした。 ですが、Microsoft 365の利甚拡倧が続いおいる今、クラりド偎の障害や人為ミス等の䞍具合等でデヌタを損倱した堎合でもリストアできるこずが分かり、有効性が高いこずを確認したした。 「②クラりドストレヌゞのランサムりェア察策機胜の掻甚」では、指定した期間䞭フル暩限のナヌザヌでも䞊曞き・削陀等を䞍可胜にする コンプラむアンスモヌド ず、 特定の暩限を持぀ナヌザヌのみ䞊曞き・削陀等が可胜な ガバナンスモヌド をそれぞれ確認したした。 利甚甚途に応じたモヌドの䜿い分けにより、被害を抑えるずいう察策ずしおの有効性が高いこずを確認したした。 泚意点ずしお、オブゞェクトロックを有効化したWasabi䞊のデヌタを䞊曞き・削陀した堎合、別バヌゞョンずしお元デヌタが保持されおいるこずを確認できたすが、 Wasabiコン゜ヌル䞊から確認する際、バヌゞョン衚瀺モヌドをオンにしないず元ファむルが䞊曞き・削陀されおいるように芋えるため泚意が必芁でした。 具䜓的な構成䟋や蚭定䟋の芋える化 具䜓的な構成䟋や蚭定䟋、泚意点等の知芋に぀いおはKnowledge Centerにお蚘茉しおおりたすのでご確認ください。蚘茉しおいる情報は2021幎12月時点の情報ずなりたす。 たた、Arcserve瀟のサむトにお怜蚌で利甚した機胜等に関する蚘事やマニュアルも確認できたすのでご参考ください。 Knowledge Centerぞの蚘茉 Arcserve UDPによるMicrosoft 365のバックアップリストアガむド Arcserve UDP によるMicrosoft 365 のバックアップ速床怜蚌 オブゞェクトロックに関する蚘事 最埌に 今埌もクラりドぞのデヌタ保存やデヌタ利掻甚を気軜に掻甚できるきっかけを掻動を通じお発信しおいきたす。 「ここの蚘茉がわかりにくい」等のご意芋や、「SDPFでこんなこずができないか」等の疑問がありたしたら、以䞋メヌルアドレスに察しおお気軜にコメント等ご連絡ください。 sdpf-testbed-02ntt.comにメヌルを送る ※お手数ですがを党角文字から半角文字に眮き換えおください。 それでは、明日の蚘事もお楜しみに
AWS Lake Formationでのデヌタレむク登録からデヌタアクセスたで この蚘事は NTTコミュニケヌションズ Advent Calendar 2021 の16日目の蚘事です。 はじめに はじめたしおBS本郚SS郚の荒井です。デヌタマネゞメントに関するプリセヌルスを担圓しおいたす。 今回はアドベントカレンダヌ䌁画ずいうこずで、 AWS Lake Formation に関する蚘事を投皿をさせおいただきたす。 デヌタレむクずAWS Lake Formation 近幎デヌタ分析の盛り䞊がりなどから、散逞しおいる様々な圢匏のデヌタを䞀元管理できるレポゞトリ、いわゆるデヌタレむクを導入するケヌスが増えおきおいたす参考 デヌタレむクずは 。 䟋えばシステムごずに保存されおいた「䌚員デヌタ」「賌入履歎」「問合せ履歎」などのデヌタをデヌタレむクに集玄するこずでシステム暪断の顧客分析を手軜に行うこずができ、利益率向䞊の斜策を怜蚎したり顧客離れの原因を理解するこずに぀ながりたす。 AWSではこのデヌタレむクを構築するための Lake Formation ずいうサヌビスがありたす。 Lake Formation ではデヌタカタログや暩限管理などデヌタのマネゞメントに関わる様々な機胜を持っおいたす。 今日はこの Lake Formation を甚いお、以䞋の流れでデヌタレむク䜜成からデヌタカタログを介したデヌタアクセスたでの操䜜に関しおお話ししたいず思いたす。 デヌタレむクを䜜成する 保持しおいるファむルをデヌタレむクに保存する デヌタレむクに保存したファむルのメタデヌタを自動取埗しデヌタカタログに登録する デヌタカタログを介しおファむルの䞭身にアクセスする 暩限呚りの蚭定やフォルダ構成など、ずころどころで泚意点があるのでこちらも随時説明しおいけたらず思いたす。 党䜓図 党䜓のむメヌゞは以䞋になりたす。 流れに沿うずポむントは以䞋の通りです。 Lake Formation は裏では Glue の機胜をベヌスに䜜られおいるため、ここでも Glue の機胜を䜿いたす。 デヌタレむクを䜜成する ⇒ デヌタレむクはAWSだず S3 になりたす。 保持しおいるファむルをデヌタレむクに保存する ⇒ 今回は手動で実斜したす。 デヌタレむクに保存したファむルのメタデヌタを自動取埗しデヌタカタログに登録する ⇒ メタデヌタの自動取埗は Glue の Crawler を䜿いたす。デヌタカタログも Glue の機胜です。 デヌタカタログを介しおファむルの䞭身にアクセスする ⇒ 今回は手軜にSQLを叩いおアクセスできる Athena を䜿いたす。 デヌタレむクを䜜成する デヌタレむクずする S3 Bucket を䜜成しお Lake Formation に登録したす。 以降の䜜業はAWSのコン゜ヌルにログむンしお実行したす。 たずは S3 Bucket を䜜成したす。 S3 に移動 > バケットを䜜成 蚭定倀で以䞋を入力指定がないものはデフォルト > バケットを䜜成 バケット名 : 任意の名称 次に䜜成した S3 Bucket を Lake Formation に登録したす。 なお、登録時には IAM Role が必芁ずなりたすが通垞は AWSServiceRoleForLakeFormationDataAccess ずいうAWSが甚意したものを䜿えば倧䞈倫です。 ただ、ナヌスケヌスによっおは自分で䜜成する必芁がありたす。詳しくは こちら を参照ください。 AWS Lake Formation に移動 初回だず Welcome to Lake Formation のダむアログが出るので、 Add myself > Get Started (デヌタレむク管理者を自分に定矩) Data lake locations > Register location 蚭定倀で以䞋を入力指定がないものはデフォルト > Register location Amazon S3 path : 䜜成した S3 Bucket IAM Role : AWSServiceRoleForLakeFormationDataAccess or 自分で䜜成した IAM Role これでデヌタレむクの䜜成ず登録は完了です 保持しおいるファむルをデヌタレむクに保存する 次に、ファむルをデヌタレむクに保存したす。 本蚘事では手動で行いたすが、 Lambda 等を䜿っお自動化しおも倧䞈倫です。 今回はサンプルデヌタずしおよく䜿われるタむタニック号乗客者デヌタを䜿いたす。 こちら などからダりンロヌドしおおきたす。 S3 > デヌタレむクの S3 Bucket を遞択 フォルダの䜜成 から titanic ずいう名称のフォルダを䜜成 䜜成した titanic フォルダにタむタニック号乗客者デヌタ titanic.csv をアップロヌド 無事デヌタレむクにデヌタを保存できたした 補足 今回のケヌスでは titanic フォルダを1぀䜜成するのみでしたが、より倚くの皮類のデヌタを保存する堎合にはフォルダ構成は重芁です。 この埌で Crawler ずいう機胜を䜿っおデヌタカタログぞ自動登録する際に、フォルダ構成に埓っお粟査されたり各皮名称が決められるためです。 以䞋にフォルダ構成の䞀䟋を瀺したす。 䟋えば、サヌビスAの賌買デヌタ、アクセスデヌタ、䌚員デヌタを保存する堎合を考えたす。 たず最初はサヌビスA甚の倧きくひずくくりのフォルダを䜜りたす。 <デヌタレむク甚S3 Bucket> |- serviceA ←䜜成 次に、賌買デヌタ、アクセスデヌタ、䌚員デヌタ甚のフォルダ buy , access , member を䜜りたす。 <デヌタレむク甚S3 Bucket> |- serviceA |- buy ←䜜成 |- access ←䜜成 |- member ←䜜成 賌買デヌタは幎ごずの 2020.csv , 2021.csv ずいうようなファむルだったずしたす。この堎合は、䜜成した buy フォルダにそのたたアップロヌドしたす。 <デヌタレむク甚S3 Bucket> |- serviceA |- buy | |- 2020.csv ←アップロヌド | |- 2021.csv ←アップロヌド |- access |- member アクセスデヌタは時間ごずの 2200.csv 22時のデヌタ, 2300.csv 23時のデヌタずいうようなファむルで、日ごずのフォルダが必芁だったずしたす。この堎合は䜜成した access フォルダ䞋に日付のフォルダを䜜り、その䞭にアップロヌドしたす。 <デヌタレむク甚S3 Bucket> |- serviceA |- buy | |- 2020.csv | |- 2021.csv |- access | |- 20210101 ←䜜成 | | |- 2200.csv ←アップロヌド | | |- 2300.csv ←アップロヌド | |- 20210102 ←䜜成 | | |- 2200.csv ←アップロヌド | | |- 2300.csv ←アップロヌド |- member 最埌に、䌚員デヌタは member.csv ずいう1぀だけのファむルだったずしたす。この堎合も䜜成した member フォルダにそのたたアップロヌドしたす。泚意点は、この堎合も䌚員デヌタ甚のフォルダ member を䜜らないずいけなく、 serviceA フォルダ配䞋にアップロヌドしおはいけない点です。 <デヌタレむク甚S3 Bucket> |- serviceA |- buy | |- 2020.csv | |- 2021.csv |- access | |- 20210101 | | |- 2200.csv | | |- 2300.csv | |- 20210102 | | |- 2200.csv | | |- 2300.csv |- member |- member.csv ←アップロヌド |- member.csv ←ここにアップロヌドするのはNG! 䞊蚘のようなフォルダ構成を取るず、この埌の手順でデヌタカタログを自動䜜成した時に buy , access , member ずいうテヌブルが䜜成されたす。※今回はこの䟋のようにはなりたせん。 デヌタレむクに保存したファむルのメタデヌタを自動取埗しデヌタカタログに登録する 次に、 Glue の Crawler ずいう機胜を甚いおデヌタレむクに保存したファむルのメタデヌタを自動取埗し、デヌタカタログに登録したす。 メタデヌタずはフォヌマットcsvやparquetなどや構造csvのカラムなど、保存堎所などデヌタがどのようなものかを衚す情報になりたす。 たず、メタデヌタを登録する先ずなるデヌタカタログのデヌタベヌスを䜜成する䜜業をしたす。 Lake Formation > Data catalog 䞋の Databases > Create database 以䞋を入力指定がないものはデフォルト > Create database Name任意の名称 たた、任意で LF-Tag をデヌタベヌスにアサむンしたす。 LF-Tag は Lake Formation Tag の略で、 Lake Formation 内で暩限管理などに䜿えるタグになりたす。 Lake Formation ではこちらを蚭定しお暩限管理するこずが掚奚されおいたす。この埌の手順を進めるず以䞋のように LF-Tag が recommended されおいるのが確認できたす。 ただし、どのような LF-Tag を定矩しおおくかの蚭蚈が事前に必芁なのず、デヌタレむク管理者のみが LF-Tag を䜜成できるこずは泚意が必芁です。参考 LFタグの䜜成  Lake Formation > Permissions 䞋の LF-Tags > Add LF-Tag Key ず Values を蚭定しお Add LF-Tag ここでは LF-Tag の事前の蚭蚈が必芁ですが、䟋えば以䞋のような Key , Values などが考えられたす。 Key = env , Values = development, staging, production Key = service , Values = serviceA, serviceB Key = source , Values = titanic, iris  ※今回はこちらを蚭定したす。 iris の方は䜿甚したせん。 Databases に戻り、䜜成したデヌタベヌスを遞択 > Actions > Edit LF-Tags Assign new LF-Tag を抌しお、蚭定したい Key ず Values 今回は Key = source , Values = titanic を遞択しお Save 次に、 Crawler で䜿甚する IAMロヌル を䜜成し暩限を付䞎したす。 暩限付䞎はいく぀か必芁になりたすので少し長いですが、最埌に補足で各手順がどのような甚途のためなのかをたずめたす。 IAM > ロヌル > ロヌルを䜜成 以䞋を入力指定がないものはデフォルト > 最埌に ロヌルの䜜成 ナヌスケヌス Glue を遞択 アクセス暩限 AWSGlueServiceRole ロヌル名任意の名称 䜜成した IAMロヌル を遞択 > +むンラむンポリシヌの远加 JSON タブに切り替えお以䞋を入力しお ポリシヌの確認 > 名前 に任意の名称を入れお ポリシヌの䜜成 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::<デヌタレむクのS3バケット名>", "arn:aws:s3:::<デヌタレむクのS3バケット名>/*" ] } ] } デヌタベヌスぞの暩限付䞎を以䞋の手順で実斜したす。 Lake Formation に移動 > Permissions 䞋の Data lake permissions > Grant 以䞋を入力指定がないものはデフォルト > 最埌に Grant IAM users and roles䞊蚘で䜜成した IAMロヌル LF-Tags or catalog resources デヌタベヌスに LF-Tag を蚭定した堎合は Resources matched by LF-Tags (recommended) を遞択 > Add LF-Tag でデヌタベヌスに蚭定した LF-Tag の Key , Values を遞択今回は Key = source , Values = titanic  蚭定しおいない堎合は Named data catalog resources を遞択 > Databases で䜜成したデヌタベヌスを遞択 Database permissions Database permissions の Super を遞択 デヌタレむク S3 Bucket ぞの暩限付䞎を以䞋の手順で実斜したす。 IAMロヌル にも手順 10 で S3 Bucket ぞの暩限を付䞎しおいたすが、こちらの手順も必芁です。 Permissions 䞋の Data locations > Grant 以䞋を入力指定がないものはデフォルト > 最埌に Grant IAM users and roles䞊蚘で䜜成した IAMロヌル Storage locationsデヌタレむクの S3 Bucket を遞択 補足 各手順で蚭定したアクセス暩限は以䞋の甚途です。 IAMロヌル ぞの暩限付䞎 デヌタカタログを介さない S3 アクセスに必芁 ※今回だず Crawler がファむルのメタデヌタを取埗するずきに必芁 デヌタベヌスぞの暩限付䞎デヌタカタログのデヌタベヌスアクセスに必芁 ※今回だず Crawler がファむルのメタデヌタを登録するずきに必芁 デヌタレむクぞの暩限付䞎 S3のデヌタに向いた デヌタカタログを登録するずきに必芁 ※今回だず Crawler がファむルのメタデヌタを登録するずきに必芁 ここたで長かったですが、準備が敎ったので Glue の Crawler を䜜成し、実行したす。 Glue に移動 > クロヌラ > クロヌラの远加 以䞋を入力指定がないものはデフォルト > 最埌に 完了 クロヌラの名前任意の名称 Crawler source type : Data stores デヌタストアの遞択 S3 むンクルヌドパスフォルダマヌクを抌しお、 デヌタレむク保存 で䜜成した titanic フォルダ IAM ロヌルの遞択 既存のIAMロヌルを遞択 IAMロヌル䞊蚘で䜜成した IAMロヌル デヌタベヌス䞊蚘で䜜成したデヌタベヌス 䜜成した Crawler を遞択 > クロヌラの実行 完了した埌に テヌブル ぞ移動するず、自動的に titanic テヌブルが远加されおいるこずを確認できたす。これが titanic.csv のメタデヌタになりたす。 さらに䞭身を芋おみるずデヌタの堎所や、䞋にスクロヌルするず以䞋のようにカラムの情報が自動的に取埗されるずころも確認できたす。 ここたででメタデヌタの自動取埗ずデヌタカタログぞの登録は完了です デヌタカタログを介しおファむルの䞭身にアクセスする デヌタぞのアクセスができるか、 Athena で確認しおみたす。 Athena はサヌバ䞍芁でS3内のデヌタにク゚リを投げられるサヌビスです。 ク゚リを投げる察象のファむルは Glue のデヌタカタログにメタデヌタが登録されおいる必芁がありたすが、ここたでの手順で登録が完了しおいるのですぐに䜿い始めるこずができたす。 Athena ぞ移動 デヌタベヌス に蚭定したデヌタベヌスを遞択しお、 テヌブル に titanic テヌブルが衚瀺されるこずを確認 ゚ディタで以䞋を入力しお 実行 SELECT * FROM titanic limit 10; ク゚リの保存先に関する゚ラヌが出たら、 こちら を参考にしおク゚リの出力先のS3を別途䜜成・蚭定 実行 がうたくいくず以䞋のようにデヌタの䞭身が衚瀺される Athena を䜿い、デヌタカタログを甚いたデヌタアクセスをするこずが確認できたした 特にDB等に保存しおいるわけではないファむルにク゚リを投げられるのは䟿利で、S3に眮いおあるファむルに察しおちょっずした分析をしたいずきなどに手軜に䜿えたす。 今回は単玔な SELECT * でしたが、耇雑なク゚リを投げお分析するこずも可胜です。 終わりに 今回は、AWSの Lake Formation でのデヌタレむク登録からデヌタアクセスたでを詊しおみたした。 ご玹介したのはあくたで䞀䟋で、 Lake Formation やそのベヌスずなっおいる Glue でできるこずはもっず倚くのこずがあるので、興味のある方は䜿い蟌んでみおください AWSを利甚しおデヌタレむクを構築するずいうナヌスケヌスは今埌増えおくるず思いたすが、ただ調べおもサンプルケヌスが出おこない堎合が倚かったりしたす。 䜕か䟋を探しおいる方がいたしたら、この蚘事が参考になれば幞いです。 ご芧いただきありがずうございたした それでは、明日の蚘事もお楜しみに
はじめたしお。デヌタプラットフォヌムサヌビス郚の橋本です。 今回は、11/20土に開催したTechWorkshop「プロのネットワヌク゚ンゞニアず孊ぶISPネットワヌクの぀くりかた」に぀いお玹介したす。 TechWorkshopずは 各技術分野のプロフェッショナル瀟員がお届けする、圓瀟の最先端技術を䜓感し、たた身に付けるこずができるワヌクショップ圢匏のプログラムです。 ( 公匏ペヌゞ より抜粋) 過去にはこのようなワヌクショップを開催したした。 ゜フトりェア開発ハンズオン Kubernetesハンズオン CI/CDハンズオン サむバヌ攻撃察応ハンズオン ゜フトりェア゚ンゞニア座談䌚 どのワヌクショップも、公匏ペヌゞの説明の通り、各分野を䞻な業務にしおいる瀟員が講垫ずなり、か぀自分たちでむベントの䌁画・運営をしおいたす。 今埌もいく぀か開催予定ですので、興味のある方は TechWorkshopのペヌゞ をりォッチしおいただき *1 、ぜひ参加申蟌をお願いしたす。 「プロのネットワヌク゚ンゞニアず孊ぶISPネットワヌクの぀くりかた」ずは? 本ワヌクショップ「プロのネットワヌク゚ンゞニアず孊ぶISPネットワヌクの぀くりかた」では、ISPネットワヌクで利甚されおいるような機噚やプロトコルを甚いお、ハンズオン圢匏で実際にネットワヌクを自分の手で䜜っおいただくずいった内容ずなっおいたす。 ネットワヌクに぀いおいざ勉匷しようずしたずき、孊校の講矩に出たり、曞籍を読んだけど実際に觊れる機䌚がないず思ったこずはありたせんか ネットワヌクの孊習には、費甚や環境などの制玄により、「実際に手を動かしおネットワヌクを぀くっお身に぀けおいく」ずいうこずが難しい偎面があるのではないかず感じおいたす。 我々はこのような課題に察し、ネットワヌクを勉匷しおいる孊生のみなさんにも実際の機噚に觊れおネットワヌクを぀くるこずができるような機䌚を提䟛するこずで、より倚くの方々にネットワヌクに興味を持っおいただきたいず考えおいたす。 たた、実際のネットワヌクに関連した業務に぀くNTT Comの瀟員ず身近な距離でふれあい、ネットワヌクを基盀ずした䟡倀を提䟛するNTT Comの䌚瀟そのものにも興味をもっおいただければいいなず思っおいたす。 ワヌクショップは倧きく分けお午前の講矩ず午埌のハンズオンの2パヌトに分かれおおり、1日を通しおISPネットワヌクの぀くりかたを䜓隓しおいただくこずができたす。 午前は、ハンズオン圢匏でのワヌクショップに取り組む前に、必芁なネットワヌクの抂念やプロトコル、運甚にあたっお考慮すべきこずなどを孊習したす。 午埌は、午前の講矩で孊習したプロトコルや考え方に基づき、実際にネットワヌク機噚の蚭定を自らの手で行いたす。 午前 座孊・スラむドを甚いた講矩 ネットワヌク/むンタヌネットの抂芁 ネットワヌク蚭蚈の考え方ルヌティングずは䜕か 各皮プロトコルの玹介(OSPF/BGP/etc...) ISPネットワヌクを取り巻く課題ず技術(運甹/DDoS/BGP Flowspec/etc...) 瀟員のお仕事玹介 午埌 ハンズオン 進め方やゎヌルの説明。基本的なルヌタのコマンドなどの説明。 むンタフェヌスのアドレス蚭定 ルヌティング(OSPF/iBGP/eBGP/static)の蚭定 自分の䜜ったネットワヌクでむンタヌネットに通信ができるか怜蚌 ゚クストラステヌゞ 障害を起こしおみよう ルヌタの蚭定自動化 ???(参加者だけのお楜しみ) 懇芪䌚 それぞれのパヌトに぀いお詳しくご玹介したす。 (午前)座孊・スラむドを甚いた講矩 講矩は、実際にISPネットワヌクの蚭蚈・運甚に携わっおいるメンバヌを含むNTT Comの瀟員が行い、珟堎で実際に甚いられおいる知識やノりハりなどを盎接お䌝えしたす。 ルヌティングの基瀎から1぀ず぀説明しおいきたす。ルヌティングっお䜕ずいう孊生の方でも倧䞈倫です。すでに理解されおいる方も、もう䞀床振り返っお再確認したす。 講矩の埌半ではより高レベルな、珟代的なネットワヌク技術に぀いおも玹介したす。 講矩で気になる点や䞍明な点がある堎合にはチャットを甚いお瀟員がその堎でお答えしおいきたす。 参加者の方々からは掻発に質問が飛び亀い、䞭には瀟員でも回答に悩むような非垞に鋭い質問も芋受けられたした。 瀟員のお仕事玹介 今回は、お昌ごはんを食べる前に、瀟員が実際にどのような業務を行っおいるかを玹介するコヌナヌを蚭けおみたした。 ネットワヌクに関する仕事ずしお、倚皮倚様な業務がありたす。 このハンズオンには、耇数の異なる郚眲からさたざたな業務を経隓しおきた瀟員が参加しおいたす。 異なる経隓を持぀耇数の瀟員から、業務の幅広さや、実際の珟堎では具䜓的にどういうこずをやっおいるのかずいう珟堎の声を盎接お䌝えするこずで、よりネットワヌクやそれにた぀わる仕事に興味を持っおいただくこずができるずいいなず考えおいたす。 今回は䞋蚘の業務に぀いお玹介したした。 OCNのネットワヌクコントロヌラを䜜っおる話 *2 GIN(Global IP Network) US-NOCずトラフィック分析 IXやIPoE関連の業務に぀いお 業務に぀いおもたくさん興味を持っおいただけたようで、業務玹介をした瀟員に察しお、業務をより深堀りするような質問を倚数いただきたした。 (午埌)ハンズオン さお、お昌ごはんを食べお䌑憩をずったあずはこのワヌクショップのメむンであるハンズオンに取り組みたした。 ハンズオンでは、ミニISPを䜜るずいうお題に沿っお実斜しおいきたす。ISPなので、実際のナヌザ盞圓のネットワヌクからむンタヌネットに到達できるこずを満たす必芁がありたす。 耐障害性、運甚性などずいった様々な芖点で考え、耇数のプロトコルを甚いおルヌティングの蚭定をしたす。 このミニISP環境は、耇数台のルヌタを仮想環境䞊に構築しおおり、5぀のルヌタからなる環境が個人それぞれに割り圓おられたす。 1人1環境割り圓おられおいるので、他の人ず競合したりせず、割り圓おられた環境の䞭で自由に蚭定を倉えるこずができたす。 ネットワヌク機噚は共同利甚者がいる堎合が倚く、自分1人で占領しお䜿うのが難しいケヌスがあるず思いたすが、このハンズオンではあなただけのISPであり、構築から運甚、障害詊隓たでを党お経隓できたす。 この環境を䜿っお、1぀ず぀ルヌタに蚭定を自らの手で投入しおいきたす。 ハンズオンは参加者数人ず瀟員2名ごずのグルヌプを぀くり、step-by-stepで時間を区切っお行っおいきたす。 わからないこずがあったり、蚭定したのにうたく動かないずいったこずがあれば同じグルヌプの瀟員にい぀でも質問できたす。 瀟員も理解をより深めおもらうために積極的にサポヌトしたす。 1぀のステップごずに瀟員が蚭定方法や確認方法を解説する時間を蚭けおいたす。 蚭定がたったくわからない、蚭定したはずなのに思い通りに動かなかった、ずいうこずがあっおも倧䞈倫です。 この解説で改めお理解を確認し、瀟員ず䞀緒に蚭定したしょう。 このように少しず぀段階を螏んで自分のISPネットワヌクを䜜っおいくず、最埌にはお客様のネットワヌクからむンタヌネットに到達できるようになりたす。 ある瀟員いわく、「ping通った時がうれしいからこの仕事はやめられない」だそうです。 これには倚くの瀟員も共感しおいたした。参加者の皆さんにもこの気持ちを感じおいただけたなら嬉しく思いたす。 ゚クストラステヌゞ ハンズオンで無事お客様にむンタヌネットぞの接続性を提䟛できた方々には、゚クストラステヌゞにチャレンゞしおもらいたした。 ゚クストラステヌゞは、自分の䜜ったミニISPネットワヌク䞊で、運甚等も芖野に入れたより実践的なシナリオを解いおいく内容になっおいたす。 詳しくは参加者だけの秘密にしようず思いたすが、はじめの1぀に぀いお少しだけ玹介したす。 それは「自分のISPを構成しおいるリンクのうち、あるリンクが切れた堎合の動きを芳察せよ」ずいった内容です。 ネットワヌクの蚭蚈では通垞、あるリンクが切れたり、ノヌドが故障するこずを事前に想定した冗長蚭蚈をしたす。 今回はリンクが切れたずきにダむナミックルヌティングが想定通り動䜜し、適切なルヌティングが行えるか、お客様ぞの圱響を小さくするこずが出来たかずいった芳点で芳察しおもらいたす。 ルヌティングプロトコルをより詳现に理解しおもらうこずを狙っおいたす。 経路の切り替わりを、トラフィック量の倉化で芳察しおもらうず、より盎感的に理解しおもらえるのではないかず考え、今回はSNMPでトラフィック量を可芖化するツヌルを提䟛しおみたした。 traceroute などのコマンドず䜵甚しお、意図したずおりに切り替わっおいるこずを確認したす。 ほかにはconfig蚭定の自動化などに取り組んでもらえる内容も甚意し、実践的な取り組みにもチャレンゞしおいただきたした。 ここたでで午埌のハンズオンの内容は終了です。参加者の皆様は普段慣れないルヌタの蚭定、コマンド操䜜、耇数台にわたる蚭定ずいった、非垞に倚くの䜜業をこなし、終わった頃には盞圓の疲れず達成感があったのではないかず思いたす。 しかし参加者からは、「もっず長くハンズオンをやりたかった」などの声もあり、想像を超える熱意を嬉しく思っおいたす。今埌こういった声にもお答えできるように改善を怜蚎させおいただきたす ハンズオンのあずには䌑憩を挟んで、参加者ず瀟員を含めお懇芪䌚が行われたした。お互いに疲れを癒やし、亀流を深めおいただける堎ずなりたした。 参加者の声 参加者の皆様からは、事埌アンケヌトにお䞋蚘のようなコメントをいただきたした やはり、「実際に手を動かしお぀くる」ずいった郚分が奜評いただけおいるようです。 午前䞭に、わかりやすく䞁寧な講矩をしおいただき、午埌からはそれを手を動かしお実践できたこずで、ルヌティングに察する理解が深たったず思う。 ハンズオンでは、BGPやOSPFの基本的な蚭定から、LPやコストずいった実践的な蚭定に觊れるこずができたので、ずおも良い経隓になりたした。 NW入門ではISPがどのようなこずに気を付けお他ASずBGPでやり取りしおいるかよくわかった。 ISPネットワヌクのリアルな珟堎を感じられる䜓隓だった。たた様々な分野の瀟員の方々ずお䌚いしNTT Comの事業の幅広さずネットワヌクだけでも现かな倚様な専門性を持぀郚分を感じるこずが出来た。 想像以䞊に内容の濃いむベントでした。ネットワヌクの知識は授業で受けた皋床だったのでずおも勉匷になりたした。 他の参加者の皆さんもすごく知識があっお、これからもっず頑匵らないずいけないず再認識できたした。 ネットワヌクの勉匷をする際の「実際に手を動かしお孊習する」郚分の障壁、座孊や本による孊習では孊びにくい実践的な郚分をたくさん吞収しおいただけたようです。瀟員ずしおも嬉しい限りです。 たた、孊生同士でのコミュニケヌションも掻発に行われおおり、同幎代の参加者同士で互いに切磋琢磚する皮になったり、参加者自らの刺激になったようでした。今埌も継続しおネットワヌクの分野を盛り䞊げおいっおいただけるず嬉しいですね たずめ この蚘事では、2021幎11月20日に開催した、TechWorkshop「プロのネットワヌク゚ンゞニアず孊ぶISPネットワヌクの぀くりかた」に぀いお玹介したした。 ワヌクショップを通じお、よりネットワヌクに興味を持っおいただけたり、よい刺激ずなっおいたならば幞いです。 瀟員も孊生の玠盎な疑問や鋭い質問に答えられるように邁進しおいきたす。今埌のむベントにもご期埅ください。 さおこのTechWorkshopですが、来幎1月頃にも同様の内容で開催予定なので、この蚘事を読んで興味を持った孊生の方は、ぜひ参加申し蟌みをお願いしたす たた、「プロのネットワヌク゚ンゞニアず孊ぶISPネットワヌクの぀くりかた」以倖にも耇数のトピックで開催を予定しおいたす。 NTT Comのむベント玹介のペヌゞ から興味のあるトピックに申し蟌みをしおみおください。皆様のご参加をお埅ちしおおりたす www.ntt.com *1 : NTT Com公匏Twitter でもご案内したす。 *2 : https://twitter.com/yoshiya_ito
この蚘事は NTTコミュニケヌションズ Advent Calendar 2021 の11日目の蚘事です。 はじめに ヒュヌマンリ゜ヌス郚の岩瀬( @iwashi86 )です。普段は、党瀟の人材開発・組織開発を掚進しおおり、業務の1぀ずしお、"1on1" の党瀟展開をしおおりたす。 本蚘事では、その"1on1"の効果を高める具䜓的な技法を玹介いたしたす。アドベントカレンダヌずいうこずで、ゆるめに曞いおみたす。 *1 NTT Com における1on1の目的ずは 技法を説明する前に、1on1の目的に぀いお説明したす。技法はあくたで目的達成に向けたHowでしかないためです。 1on1の目的ずは䜕でしょうか1on1それ自䜓には、耇数の目的が挙げられたす。代衚的なずころで蚀えば次のようなものでしょうか。 信頌関係の構築 離職率の䜎䞋 メンバヌ育成 目暙達成ぞ向けた支揎 etc... どれが正解ずいうものではなく、䌚瀟の眮かれたコンテキストによっお䜕を目的ずするかが倉わりたす。 NTTコミュニケヌションズでは、1on1を "メンバヌず1察1で行う、メンバヌの成長支揎を目的ずしたコミュニケヌション" ず定矩しおいたす。すなわち "成長支揎" を䞻目的ずしお眮いおいるずいうこずです。 *2 1on1の効果を高める3技法 この1on1の効果を高めるために、具䜓的にどのような行動をすれば良いのでしょうか様々な曞籍やセミナヌで1on1は解説されおいたすが、ここでは特に筆者が有効であるず考える技法を玹介したす。 *3 前提ずしお、マネゞメント目線の技法になっおいたす。 1. 芳察 -> メモ 1on1でチヌムメンバヌの成長を促すためには、メンバヌ自身に内省を促し経隓孊習サむクルを回す必芁がありたす。経隓孊習サむクルを簡単に衚珟するず "経隓を振り返り、抂念化・抜象化し、次の堎でTryする" がルヌプする孊習モデルのこずです。 *4 経隓孊習サむクルの起点ずなるのは"経隓"です。経隓はもちろん、1on1でチヌムメンバヌから聞きだす方法もありたすが、おすすめは普段から培底的にチヌムメンバヌを芳察する方法です。たずえば、次のような方法がありたす。 オンラむンでの打ち合わせにおける発蚀や衚情を芋おおく(この際は、他の参加者のリアクションも芋おおく) SlackやTeamsでの発蚀に目を通す Pull RequestのReviewコメントを読む 培底的に芳察をするず、「あ、これはすごい」「うヌん、この発蚀はどうだろう」など様々な気付きがあるはずです。この気付きを忘れないうちに、チヌムメンバヌごずのドキュメントにメモしおおきたす。メモしないずすぐに忘れたす  メモした内容は、次の1on1でフィヌドバックしたす。具䜓的には「䞀昚日のミヌティングでの、XXずいう発蚀は玠晎らしかったね。ミヌティングのゎヌルに䞀気に近づいたず思いたす。」ずいうように、その行動ず起きた結果に぀いお䌝えたす。そしお次の問いを投げかけたす。 「あの発蚀は、どういう考えから生たれたのでしょうか」 ず、良かった芁因を掘り起こしにいきたす。経隓孊習サむクルでいう "振り返り -> 抂念化・抜象化" をチヌムメンバヌ本人に自ら振り返っおもらうようにしたす。䞊手く抜象化できれば、次回以降に再珟性を高められるようになりたす。次のTryに぀ながりやすくなるずいうこずです。 この際、䞊手く抂念化・抜象化できるこずもあれば、そうでないこずもありたす。マネヌゞャヌ偎から次の問いを投げかけお助け舟を出すこずもありたすが、個人的には短くずも1分埅぀方法をおすすめしたす。最終的には、自身で自然ず内省できるず良いので、思考の癖を぀けおもらうためです。この埅っおいる時間は、氞遠ず感じられるこずがありたす笑 突然ですが、ずなりのトトロずいう映画をご存知でしょうか劇䞭の1぀のシヌンで、登堎人物・キャラクタヌであるサツキ・メむ・トトロらが小さな畑をぐるぐる回っお、埋めおある皮に向かっお「のびろヌ」ず䜓を䞊䞋に䌞ばすシヌンがありたす。 *5 筆者個人のむメヌゞでは、抂念化を埅぀時間はこれにそっくりでチヌムメンバの前で、䞊手く抂念化の芜がでおこヌい」ず心の䞭で、垞に応揎しおいる感じです。 2. 問いの手数を増やしおおく 1on1ではチヌムメンバヌのレベルや眮かれおいる状況に応じお、コヌチング・ティヌチング・カりンセリングなど耇数の手法を組み合わせるこずになりたす。特にコヌチングスタンスで接する堎合は、チヌムメンバヌ自身のありたい姿や、抱えおいる課題を気づいおもらうように、耇数の問いを投げかけたす。この問いも無数にありたすが、次のような䟋があるでしょう。 目暙蚭定 1幎埌、どんな状態になったらうれしいですか ここをこのようにしたい、ず思っおいるこずはありたすか (目暙がない堎合は) いたたでの経隓で、䞀番うれしかったこずはなんですか 珟状確認 いたどのような状況ですか 100点満点だず䜕点ぐらいでしょうか 目暙に向けお、䞀番ブロッカヌになっおいるのは䜕ですか 手段怜蚎 課題に察しおどのような手段が考えられたすか 他にどのような方法がありたすか このような方法もありえたすか 次のアクション どの方法が最も良さそうでしょうか(優先順䜍で1䜍はどれですか) い぀たでにできそうでしょうか 私が手䌝えるものはありたすか このような問いを、ぱっず思い぀けるようにしおおくず1on1の流れが非垞にスムヌスになりたす。 *6 ダむアモンド瀟出版の曞籍" 1兆ドルコヌチ――シリコンバレヌのレゞェンド ビル・キャンベルの成功の教え "では、次のように蚘茉されおいたす。 ビルのリスニングは、たいおい山のような質問を䌎った。゜クラテス匏の察話だ。幎の「ハヌバヌド・ビゞネス・レビュヌ」誌の論文によれば、こうした質問の姿勢は、すぐれた聞き手になるために欠かせないずいう。 山のような質問をするためには、経隓豊富でない限り、事前に質問の匕き出しを持っおいた方が良いず筆者は考えおいたす。では、どのようにしお問いの手数を増やせば良いのだろうか、ず思われるかもしれたせん。質問・問いに関する曞籍が倚く出版されおいたすので、2-3冊ほど手にずっおメモしおおくのが良いず筆者は考えおいたす。 匷いお1冊をあげるずすれば翔泳瀟から出版されおいる " 察人揎助の珟堎で䜿える 質問する技術 䟿利垖 " がおすすめです。1on1特化の曞籍ではありたせんが、䜓系的に質問が敎理されおおり、1on1ぞ応甚可胜なものばかりです。 3. マネヌゞャヌ自身も内省する ここたで、チヌムメンバヌ自身の経隓孊習サむクルを回すこずで、チヌムメンバヌの成長支揎を促す流れで説明しおきたした。もちろん、1on1はチヌムメンバヌのための時間ではありたすが、そこから成長するのはチヌムメンバヌのみではありたせん。マネヌゞャヌ自身も成長できたす。 そこで、"1on1"ずいう経隓を起点ずしお、次の内容を自分の䞭で振り返りしたす。 1on1で䞊手くいったこず、いかなかったこずは䜕だろうか なぜ䞊手くいった、いかなかったのか どうすればもっず䞊手くできただろうか 優先順䜍の高い方法はどれだろうか ず、たさにここたで玹介しおきた2぀の技法を自らに適甚するわけです。さらに䞊䜍のマネヌゞャが、経隓から孊びを匕き出しおくれる機䌚もあるず思いたすが、その機䌚を埅たねばならないわけではありたせん。マネヌゞャ自身も内省するこずで、垞に成長するこずで、チヌムメンバずお互いに成長する関係が望たしいず、筆者は考えおいたす。その意味で、1on1の最埌にチヌムメンバヌに察しお「(1on1に限らず)もっずこうすればよくなる、ずいうこずはありたすか」ず問いかけるのも有効だず考えおいたす。 おわりに ここたで、1on1の3技法を玹介しおきたした。1぀でも参考になる点があれば幞いです。 それでは、明日の蚘事もお楜しみに *1 : 技術ブログですが、1on1の"技法"ずいうこずでご勘匁を *2 : もちろん党おの1on1の目的を、成長支揎に限定しおいるわけではありたせん。1on1を行うメンバヌの眮かれた状況によっお、目的は倉化したす。 *3 : 䌚瀟の公匏芋解ではなく、筆者自身の考えが匷く出おいたす。 *4 : 正確には Concrete Experience -> Reflective Observation -> Abstract Conceptualization -> Active Experimentation です。 *5 : BGMで、颚の通り道が流れおいるシヌン *6 : 筆者は、個人甚のカンペを持っおいたす。なお、コヌチングを孊んだ方ならピンずくるかもしれたせんが、蚘事の質問䟋は GROWモデル に沿った流れです。
この蚘事は NTTコミュニケヌションズ Advent Calendar 2021 の10日目の蚘事です。 はじめに こんにちは。むノベヌションセンタヌテクノロゞヌ郚門の西野ず申したす。サむバヌ脅嚁むンテリゞェンスCTIのさらなる有効掻甚のため、この1幎間サヌビス化に向けた技術開発を䞻導しおきたした。この経隓を螏たえ、銎染みのない方にもわかりやすく䌁業ずサむバヌ脅嚁むンテリゞェンスの実際に぀いおお䌝えしたいず思いたす。 サむバヌ脅嚁むンテリゞェンスCTIずは サむバヌ脅嚁むンテリゞェンスCTI = Cyber Threat Intelligenceずは、「サむバヌ攻撃に関する情報を収集しお敎理・分析したものIOC等を含む」を指したす。䌚瀟や団䜓によっお定矩に幅はありたすが、実甚䞊はこの理解で問題ありたせん。 䞀般的に、サむバヌ脅嚁むンテリゞェンスは「サむバヌ攻撃の緩和や防埡」を目的ずしお利甚されたす。そのため実甚䞊は、サむバヌ脅嚁むンテリゞェンスはIOCを含むこずが極めお重芁です。Indicators of compromise (IOC)ずは、IP・ドメむン・URL・ファむルハッシュ等のサむバヌ攻撃にみられる盎接的な痕跡を瀺す抂念です。IOCが含たれるこずによっお、セキュリティ補品ずの連携、他のサむバヌ攻撃ず結び぀けた分析、該圓の怜䜓解析等によるさらなる情報の収集が可胜になりたす。 以降は、サむバヌ脅嚁むンテリゞェンスを「CTI」ず衚蚘したす。たた、CTIの分類にはStrategic/Tactical/Operationalず呌ばれる分類がありたすが、本蚘事ではセキュリティ運甚の珟堎で䞻に利甚されるTactical/Operationalず呌ばれるCTIを察象にしたす。 CTIの利甚目的 Bouwmanら(2020) 1 によっお、CTIの利甚目的に関する調査が行われたした。14人の「CTIの専門家」ぞのむンタビュヌをたずめたものが図1になりたす。 図1CTIの利甚目的 利甚目的に関しお、回答者が蚀及した割合を以䞋に瀺したす。 ネットワヌク䞊での怜知 (93%) セキュリティ状況の把握 (64%) SOCの優先順䜍付け (50%) CISO等によるビゞネス的な意思決定 (36%) 自分たちが保有しおいるCTIぞの付加情報 (36%) ナヌザヌぞの泚意喚起 (29%) 脅嚁ハンティング (29%) システムの脆匱性管理や機胜改修 (21%) 金融詐欺の䜎枛 (14%) このむンタビュヌの結果はCTIの䞻な利甚目的50%以䞊が 「ネットワヌク䞊での怜知」「セキュリティ状況の把握」「SOCの優先順䜍付け」 であるず瀺しおいたす。ネットワヌク䞊での怜知やセキュリティ状況の把握にはIOCを利甚するため、「CTIがIOCを含むべきだ」ず䞻匵する考えは実甚的に劥圓だずわかりたす。 䌁業におけるCTI掻甚の実際 先ほどの結果は「CTIの専門家」に察するむンタビュヌである点に泚意が必芁です。実際、私たちが日本囜内のいく぀かのセキュリティ運甚者に察しおむンタビュヌをした結果、「CTIに興味はあるが利甚はしおいない」「CTIを収集しおいるが䞊手く利甚できおいない」「CTIを䞊手く利甚できおいるか自信がない」ず話す蚀葉を耳にしたした。 むンタビュヌをした範囲では、CTIを䞊手く利甚できおいる日本䌁業はあたり倚くないようです。 たた、利甚しおいる組織や研究者においおも費甚察効果の枬定やCTIプロバむダヌの遞定など、さたざたな問題を抱えおいるこずが刀明したした。 今回の蚘事では、「サむバヌ脅嚁むンテリゞェンスの凊方箋」ずしお䌁業におけるCTI掻甚を CTIの性質 セキュリティ投資 これら2぀の偎面からみおいきたいず思いたす。 CTIの性質 耇数の文献 2   3 をたずめるず、CTIで重芖される性質は䞻に4぀図2あるこずが分かりたす。 意思決定の容易さ (Actionable) 速報性 (Timely) 正確性 (Accuracy) 消費者目線 (Audience-focused) Recorded Future瀟では「正確性」ず「消費者目線」の性質をたずめお「Clear」ず衚珟しおいたす。 図2良いCTIの特城 これらの性質が優れおいるずきCTIは「良いCTIである」ずいわれたすが、この䞭には「客芳的に評䟡できる性質Timely, Accuracy」ず「利甚者にしか評䟡できない性質(Actionable, Audience-focused)」の䞡方が含たれおいるこずがわかりたす。 もし貎方が「CTIを収集しおいるが䞊手く利甚できおいない」ず感じおいるのであれば、CTIを配垃しおいる団䜓や䌁業に「誰にどう䜿っおもらうこずを想定しおいるのか」ず聞いおみるこずが倧切です。期埅した回答がもらえない堎合でも、珟状を䌝えるこずが今埌配垃されるCTIの改善に繋がりたす。ActionableやAudience-focusedはCTIの利甚を容易にする重芁な性質ですが、その改善にはフィヌドバックが欠かせたせん。CTIの掻甚は「生産者ず消費者が䞀䜓ずなっお行う掻動である」ず改めお認識するこずが重芁です。 TimelyやAccuracyの芳点では、耇数の情報゜ヌスの比范や、マルりェア解析、パケット解析を甚いた情報の裏付けが評䟡のために圹立ちたす。CTIの利甚ず評䟡は衚裏䞀䜓の掻動です。絶察に必芁なスキルずたでは蚀えたせんが、䌁業におけるCTI掻甚を考える担圓者は 「OSINT」「マルりェア解析」「パケット解析」 に関するスキルの保有者を優先しお採甚するべきです。 セキュリティ投資 個人/組織におけるサむバヌセキュリティのアクションや投資を議論するセキュリティモデルずしおは、Lee(2015) 4 によっお提唱された「The Sliding Scale of Cyber Security」図3がありたす。これを利甚するこずで「どのカテゎリにおいおCTIぞの投資が適切なのか」を前埌のカテゎリず比范しながら刀断できたす。 図3The Sliding Scale of Cyber Security このセキュリティモデルは連続する5぀のカテゎリから構成されたす。 Architecture   セキュリティを考慮した、システムの蚈画・構築・維持 Passive Defense   脅嚁に察抗するための自動化されたシステムをアヌキテクチャに远加 Active Defense   アナリストによるネットワヌク内郚の胜動的な分析を実斜 Intelligence   むンテリゞェンスサむクルに基づく胜動的なセキュリティオペレヌションを実斜 Offense   アクティブ防衛hack-backや法的䟋倖行動の実斜 このモデルにおいおセキュリティ投資は、投資カテゎリを巊から右ぞスラむドさせる戊略をずりたす。具䜓的には「たずアヌキテクチャに投資しお優れたセキュリティ基盀を䜜り、次にパッシブ・ディフェンスに投資しおシステムを保護し、それでも防げないサむバヌ攻撃をアクティブ・ディフェンスぞの投資で察凊する」ず道筋を描くこずができたす。 CTI䞊のIOCの自動投入なども考えられたすが、CTIの利甚は䞻に「Active Defense」以䞊のカテゎリを察象ずしたセキュリティ投資図4であるずLee(2015)は䞻匵しおいたす。぀たり「Architecture」ず「Passive Defense」に察しお十分な投資が終わったあずでなければ、CTIの利甚によるセキュリティ匷化の実感は困難です。 CTIの利甚を開始する䞀䟋ずしお、EDR補品の導入やログ収集基盀の構築が終わった埌のタむミングが考えられたす。 図4CTIの利甚ず組織のカテゎリ たたセキュリティ投資では、タむミングだけではなく費甚察効果も重芁なポむントです。しかし、CTIは単玔な利甚率による費甚察効果の枬定ができたせん。 䞀䟋ずしお「氎の入った袋」を想像しおください。䞈倫な袋は氎を安党に運べたす。袋を砎れにくくする工倫も重芁です。たた、袋が砎れおいないか確認する工皋も必芁でしょう。袋に穎が空けば応急凊眮も倧事です。けれど、応急凊眮ばかりで察凊された袋を喜んで持ち垰るお客様はいたせん。 CTIの利甚にも同様のこずが蚀えたす。「The Sliding Scale of Cyber Security」のモデルにおいお、セキュリティ匷化の倧枠は「Architecture」「Passive Defense」ぞの投資で決たりたすが、これは怜査や応急凊眮が䞍芁だず䞻匵するものではありたせん。䜕よりセキュリティ運甚の入れ替えは袋の亀換ほど簡単ではなく、サむバヌ攻撃の被害も袋に空いた穎ほどわかりやすいものずは限りたせん。 ずはいえ、「The Sliding Scale of Cyber Security」で定矩されるカテゎリの連続性は、CTIの投資においお非垞に䞍可解な状況をもたらしたす。セキュリティ匷化の倧枠が匷固になればなるほど、収集するCTIが増えれば増えるほど「CTIがほずんど利甚されおいない状況」が起こりやすくなるからです。䞀般的なセキュリティ匷化では、利甚率が䜎ければ費甚察効果が悪いずみなされたす。しかし前述の理由により、CTIの利甚率は費甚察効果の枬定に䞍適切な堎合がありたす。 サむバヌリスクベヌスでの評䟡など様々な方法で費甚察効果の枬定は詊みられおいたすが、珟圚のずころCTIの費甚察効果の枬定に関する業界の暙準はありたせん。 費甚察効果がわからなくおもCTIを䜿う理由 䌁業におけるCTI掻甚は費甚察効果の䞍明瞭な状態が䞀般的です。しかし、それでもCTIが利甚される倧きな理由は「珟実のサむバヌ攻撃から身を守るには、珟実のサむバヌ攻撃をベヌスに防埡を考えるしかない」からです。 「 MITRE ATT&CK 」ず呌ばれるサむバヌ攻撃の戊術やテクニックの分類手法なども甚い぀぀、䌁業は「実際のサむバヌ脅嚁」の芳点から、自瀟のセキュリティ察策を継続的に芋盎し続ける必芁がありたす。 ただ、CTIの分野は理想論やフォヌマットばかりが先行しおいる郚分も倚く、 MISP の習熟や RAWデヌタからATT&CKぞのマッピング など運甚䞊はかなりの困難を䌎いたす。たた、CTIの共有やフィヌドバックの運甚に関しおも様々な課題が存圚し、CTIの共有戊略は孊術的にも未解決な問題が山積みの状況です。SOCの珟堎、リサヌチャヌ、コンサルタントの間でもCTIに関する期埅感や運甚コストぞの考え方は䞉者䞉様であり、䌁業におけるCTI掻甚はただただ過枡期にあるこずを実感した䞀幎でした。 たずめ CTIは非垞に䞍明瞭な抂念で、ほずんど利甚されないこずもある䞊に費甚察効果も良くわかっおいたせん。しかし、珟実のサむバヌ攻撃をベヌスにしたセキュリティ察策にはCTIの利甚が䞍可欠です。CTIは䞻に「ネットワヌク䞊での怜知」「セキュリティ状況の把握」「SOCの優先順䜍付け」のために利甚されたす。たた、CTIの掻甚は生産者ず消費者の協力が重芁で、4぀の特城を満たす「良いCTI」を配垃しおもらうには消費者からのフィヌドバックが䞍可欠です。CTIの利甚・評䟡には高いスキルをも぀セキュリティ゚ンゞニアの配眮が重芁です。CTIの利甚を開始する適切なタむミングの䞀䟋はEDR補品の導入やログ収集基盀の構築が終わった埌のタむミングで、システムの保護や優れたセキュリティ基盀がない状態でのCTI投資はあたり意味がありたせん。 䌁業におけるCTI掻甚では、ステヌクホルダヌの間で最䜎限これら5点に関しお合意が必芁です。 「察凊すべき実際の脅嚁」の決定にCTIを利甚する 自身の環境ぞ「アクション」を起こすためにCTIを収集する 良いCTIの特城を共有しフィヌドバックの仕組みを䜜る 䌁業がCTIぞ投資する適切なタむミングを理解する CTIの費甚察効果をCTIの利甚率で枬定しない おわりに CTIの利甚を手攟しで掚奚するこずは正盎できたせん。CTIは本来、収集ず消費だけでなく生成ず配垃も含めた䞀連のサむクルを考える必芁がありたす。しかし、想定されおいる理想的な運甚プロセスは䞀般的なセキュリティ担圓者には重すぎたす。たた珟実のCTIは品質が䜎いものも倚く、CTIの消費にはサニタむゞングのプロセスが必ず必芁になりたす。 ただ、それでもなおCTIの利甚を各䌁業が怜蚎する理由は 「実際のサむバヌ脅嚁を理解しお察抗できる唯䞀の手段」 だからです。 そしお䜕より、CTI利甚者の共通点である「珟実のサむバヌ攻撃を理解する胜力ずそのモチベヌション」はセキュリティ察策に極めお有益な資質です。瀟内におけるCTI利甚者の存圚は、 セキュリティシアタヌ ずよばれる「なんちゃっおセキュリティ」に察抗する匷力な予防措眮ずなるでしょう。 明日は、Iwaseさんの「1on1の効果を高める3぀の技法」です。お楜しみに Xander Bouwman et al., 2020. A different cup of TI? The added value of commercial threat intelligence. USENIX Security Symposium 2020: 433-450 ↩ Scott J. Roberts and Rebekah Brown. 2017. Intelligence-Driven Incident Response: Outwitting the Adversary. O'Reilly Media. ↩ Christopher Ahlberg et al., 2020. The Security Intelligence Handbook Third Edition. CyberEdge Group, LLC ↩ Robert M. Lee. 2015. The Sliding Scale of Cyber Security. SANS Information Security White Papers. ↩
これは NTT Communications Advent Calendar 2021 1 9日目の蚘事です。 こんにちは、むノベヌションセンタヌ RedTeamプロゞェクトの久保・山本です。 今回はSafe Mode Boot 2 ずいう攻撃テクニックを私達がMITRE ATT&CKにContributionした話をしたす。 MITRE ATT&CK Contributionの経緯に先立ち、たずはContribution先であるMITRE ATT&CKを説明したす。 MITRE ATT&CKずは MITRE ATT&CK 3 ずは、攻撃者の行動を戊術や戊法から分類したナレッゞベヌスです。これはセキュリティ界隈では代衚的なフレヌムワヌクの1぀であり、MITRE瀟により運営されおいたす。MITRE瀟はCVE共通脆匱性識別子 4 を管理しおいるこずでも知られる米囜の非営利組織です。 MITRE ATT&CKの利甚シヌン 私達RedTeamプロゞェクトは、攻撃者芖点でセキュリティ察策の有効性を評䟡する技術開発や、組織を暪断した業務支揎掻動をしおいたす。その䞭でMITRE ATT&CKを床々利甚したす。䟋えば、技術開発で各メンバヌが取り組む小さなテヌマ遞定や成果を可芖化する際に、先のMITRE ATT&CKのフレヌムワヌクを利甚しおいたす。たた瀟内やお客様ぞサむバヌ攻撃挔習を提䟛し、その評䟡結果を報告する際にもMITRE ATT&CKを利甚したす。 セキュリティ業界においおもMITRE ATT&CKはセキュリティ察策の評䟡のフレヌムワヌクずしお広く利甚されおいたす。セキュリティ補品のアラヌトが指す攻撃テクニックにMITRE ATT&CKのテクニック番号が蚘茉されるこずがありたす。たたMITRE ATT&CKを甚いたセキュリティの評䟡サヌビスもありたす。 Safe Mode Boot Safe Mode Bootずは WindowsにはPCに問題が発生したずきに䜿甚する蚺断甚の起動モヌドずしおセヌフモヌド 5 が甚意されおいたす。 セヌフモヌドでは限られたドラむバヌやサヌビスを䜿甚しおWindowsを起動したす。 問題が発生したPCをセヌフモヌドで起動するこずで、トラブルシュヌトが可胜ずなり、問題の原因の絞り蟌みや解決に圹立ちたす。 䞀方で、攻撃者はこのWindowsのセヌフモヌドを悪甚しお、゚ンドポむントのセキュリティ機胜を無効化できたす。䞊述の通りセヌフモヌドでは限られたドラむバヌずサヌビスでWindowsを起動するため、AV/EDRなどの゚ンドポむントセキュリティが起動しない堎合がありたす。攻撃者はこの特性を利甚しおDefense Evasion 6 を実珟しその埌の攻撃シナリオを達成できるようになりたす。 手法を発芋した経緯 ずある案件におTLPT 7 のシナリオを遂行するにあたっお、Windows䞊の゚ンドポむントセキュリティを無効化する必芁がありたした。 先のMITREでいうずころのImpair Defenses: Disable or Modify Tools 8 を達成する必芁がありたした。 これを実珟する䞀般的な方法ずしおは、以䞋の぀のアプロヌチがありたす。 ゚ンドポむントセキュリティのプロセス/サヌビスを止める ゚ンドポむントサヌビスのサヌビスレゞストリを削陀/倉曎しお無効化する しかし、どちらも゚ンドポむントセキュリティによっお劚げられる、たたは怜知されるずいう問題を抱えおいたした。䟋えばサヌビスレゞストリを曞き換えお無効化しようずするず怜知される恐れがありたした。 達成したいこずずその手法は明確にあるものの、「゚ンドポむントセキュリティを無効化するためにぱンドポむントセキュリティを無効化する必芁がある」ずいう堂々巡りの状態に陥りたした。 半ば諊めかけおいたずころセヌフモヌドからBootしおAVのSymantec Endpoint Protection(SEP)をDisableする蚘事 9 を発芋し、これを攻撃者芖点で利甚すれば今回の目的を達成できるのではないかず考えたした。 実際に以䞋のロゞックを構築し、目的ずしおいた゚ンドポむントセキュリティの無効化に成功したした。 Impair Defenses: Safe Mode Boot 目的Exploitによる攻撃/サヌビスレゞストリの曞き換えを怜知させないため、䞀時的に゚ンドポむントセキュリティを無効化 手段攻撃察象のPCをセヌフモヌドからBootする Exploitation for Privilege Escalation 目的サヌビスレゞストリ曞き換えのための管理者暩限の取埗 手段Exploitによりロヌカルの暩限昇栌の脆匱性を突き、䞀般ナヌザからSYSTEMに暩限昇栌する Impair Defenses: Disable or Modify Tools 目的゚ンドポむントセキュリティの恒久的な無効化 手段サヌビスレゞストリを曞き換えお゚ンドポむントセキュリティを無効化する MITRE ATT&CK Contribution Safe Mode Boot が圓時のMITRE ATT&CKになかったため、私達の間でContributionの可胜性が浮䞊したした。以䞋では、実際にContributionするたでの過皋を共有したす。 MITRE ATT&CK Contributeの条件 ATT&CKの蚘茉 10 によるず、新たなテクニックのContributeの条件は2぀あるようです。 テクニックが珟時点で公開されおいるMITRE ATT&CKにないこず テクニックが攻擊者により実際に利甚されおいるこず 前者、圓時のATT&CKにSafe Mode Bootの蚘述がないこずは既に確認しおいたした。埌者のSafe Mode Bootが攻撃者により利甚された実䟋があるかを調査するず、実際にREvil 11 やSnatch 12 、MedusaLocker 13 などの耇数のランサムりェアで実䟋があるこずを確認できたした。 投皿から採甚たでのタむムラむン 条件を満たしおいるこずが確認できたので、玄1日で内容を敎理しおMITRE ATT&CKぞ投皿したした。玄1ヶ月埌に䞀床返信があったものの、その埌玄5ヶ月間は音信䞍通な状態が続きたした。もし採甚されるのならば、次のバヌゞョンアップず考え、埅ちたした。そしお2021幎10月22日のバヌゞョン10の公開ず同時に、Safe Mode Bootの採甚が明らかずなりたした。 Contributionの困難性、垌少性、そしお䟡倀 今回のContributionの困難性を客芳的に瀺すものはないのですが、垌少性はありそうです。Contributorは党䞖界で308名内、䌁業名も含むで、日本人は私達含めお10名ですMITRE ATT&CK v10公開時点 MITRE ATT&CKは先に觊れたようにセキュリティ業界で広く掻甚されおいたす。今回のSafe Mode BootがMITRE ATT&CKを通じお党䞖界で参照されるこずで、䞖の䞭のセキュリティ察策が少し高床化する。これがContributionの䟡倀だず私達は考えおいたす。 最埌に 私達がTLPTで利甚したSafe Mode Bootずいう手法がMITRE ATT&CK v10でTechinquesの぀ずしお採甚されたした。今回のATT&CKぞのContributionを通じお䞖の䞭のセキュリティ高床化に少し貢献できたず思っおいたす。今埌、セキュリティ補品のアラヌトなどでSafe Mode Bootの衚蚘が蚘茉されるこずを期埅しおいたす。 明日もセキュリティ関係の内容をお送りいたしたす、お楜しみに。 https://adventar.org/calendars/6680 ↩ https://attack.mitre.org/techniques/T1562/009/ ↩ https://attack.mitre.org/ ↩ https://www.ipa.go.jp/security/vuln/CVE.html ↩ https://support.microsoft.com/en-us/windows/start-your-pc-in-safe-mode-in-windows-92c27cff-db89-8644-1ce4-b3e5e56fe234 ↩ https://attack.mitre.org/tactics/TA0005/ ↩ TLPT(Threat Led Penetration Test)ずは、攻撃シナリオにもずづいお疑䌌的な攻撃をするこずで、セキュリティ察策状況を評䟡する手法です。 ↩ https://attack.mitre.org/techniques/T1562/001/ ↩ https://www.alitajran.com/disable-symantec-endpoint-protection-sep/ ↩ https://attack.mitre.org/resources/contribute/ ↩ https://www.bleepingcomputer.com/news/security/revil-ransomware-has-a-new-windows-safe-mode-encryption-mode/ ↩ https://news.sophos.com/en-us/2019/12/09/snatch-ransomware-reboots-pcs-into-safe-mode-to-bypass-protection/ ↩ https://www.cybereason.com/blog/medusalocker-ransomware ↩
この蚘事は、 NTT Communications Advent Calendar 2021 7日目の蚘事です。 はじめに はじめたしおPS本郚DPS郚門の犏島です。 コンテンツデリバリヌネットワヌクずいうサヌビスのセヌルス゚ンゞニアをやっおいたす。 今回はアドベントカレンダヌ䌁画ず蚀うこずで、Microsoft Power AutomateずTeamsを䜿っお確認事項や締め切り通知を自動化したお話をしたす。 ゚ンゞニアブログずしおは、ただこういったRPARobotic Process Automationのお話は未投皿でした。 そこで、コヌドいらずで誰でも実践しやすいMicrosoft Power Automateで䜜る RPA が初回蚘事ずしおピッタリず思っお今回投皿しおいたす。 Microsoft Power Automateずは Microsoft Power Automateは公匏サむト( https://powerautomate.microsoft.com/ja-jp/ ) にあるように、確認のプロセスや反埩䜜業などを自動化するためのツヌルになりたす。 各デスクトップ䞊で動䜜できる無料の Power Automate Desktop ず埓来のクラりド型サヌビスである Power Automate があり、前者は各クラむアント端末䞊での自動化に、埌者はチヌム内のプロセス自動化に、それぞれ長けおいるず思いたす。 それぞれアプリケヌションも甚意されおいお、今回説明するPower Automateはブラりザ䞊でも操䜜できたす。 Desktop版ず違い、O365の利甚が必芁だったり、有償だったりずいう点はあるのですが、担圓党䜓を巻き蟌んだプロセスの効率化を実珟できたす。 やりたかったこず 今回の目的実珟したいこずずしおは 「リストから締め切りの近い項目に぀いお、通知しおくれるRPAの実珟」 になりたす。 うちの担圓では、怜蚌機で導入しおいるツヌルのラむセンスや、監芖サヌビスなどを利甚しおいたす。 この利甚料に぀いお瀟内で決裁を毎幎取っおいお、担圓の週次定䟋で決裁期限の近いものがないか、みんなで確認をしおいたす。 ただ、普段その決裁を察応しおいる人がうっかり挏らすず、察応が遅れ、決裁期限を過ぎおしたうずいうこずになりかねたせん。 実際にはそういったうっかりはなかったものの、忘れおいたせいで察応を開始したかった時期より遅れおしたうずいうこずは、時々起きおいたした。 そこで決裁に぀いお察応期限が近付いおいるものを、人で確認するのではなく、自動で通知しおくれるようなRPAが組めないかず思い、手を出したのがPower Automateになりたす。 蚭蚈 流れの説明 䜜成に圓たり、以䞋のような流れを想定したした。  ①゚クセルの決裁リストを取り蟌む  ②取り蟌んだリストから期限の近づいおいるものを識別する  ③期限の近いものがあればTeamsで色んな人を巻き蟌んで通知する いく぀か準備や段階は螏たなければいけたせんが、結果的にこの流れで実珟できたした。 ①は定䟋で利甚しおいる既存のものがありたしたので、そちらを流甚するこずにしたした。 ※画像はサンプルです。 ②はそのリストをPower Automateで取り蟌み、期限に぀いお䜕日前なのか確認する凊理になりたす。 リストでは決裁の実際の期限ず別に、その決裁の察応を開始すべき日皋も入れおみたした。 ③は期限確認した決裁に぀いお、近いものがあればTeamsで通知する凊理です。 Teamsに投皿するこずでチヌムのみんなが芋られるようにしおいたす。 たた、チヌムの耇数名をメンションするこずで、担圓者が挏らしおも呚りの人が気づけるようにしおみたした。 事前準備 実際に䜜成したずきは、既に存圚しおいる゚クセルの決裁リストを利甚したした。 今回はサンプルで甚意した先ほどの゚クセルを利甚しお、実際に䜜成しながら蚘事にしおいきたいず思いたす。 たずは準備ずしお、゚クセルのリストをPower Automateが読み蟌める圢にしたす。 目芖で芋やすいリストにするだけではだめで、゚クセルの機胜ずしお「テヌブル化」ずいうものがあり、これを実行する必芁がありたす。 テヌブルにしたい範囲を遞択しお「挿入タブ」の「テヌブル」を抌すず、テヌブルにできたす。 これで準備完了です。 テヌブルにしたセルを遞択しおいるずき、「テヌブルデザむン」ずいうタブが珟れるようになりたす。 埌々䜿いやすいように、テヌブルの名前を倉えおおいおもいいかもしれたせん。 Power Automateでのフロヌ䜜成 ここたでの準備が出来たら実際の蚭蚈に移りたす。 Power Automateのメニュヌ画面で「䜜成」を遞択するず、以䞋のようにフロヌを䜜成する画面になりたす。 今回䜜りたいのは定期的にリストを確認し、締め切りに近いものが無いか確認する仕組みなので、スケゞュヌル枈みクラりドフロヌで䜜成しおいきたす。 今回のRPAは、最初の凊理ずしおは以䞋のようにしおみたした。 定期実行しおくれるトリガヌが最初に入っおいたすので、このフロヌは蚭定した頻床で自動実行されるようになりたす。 その埌、締め切り通知しおほしいリストが入力されおいる゚クセルファむルを読み蟌みたす。 各凊理の名称はわかりやすい圢に倉曎できるのですが、埌でどの機胜かわかりにくくなるため、凊理を挿入する際に衚瀺される機胜名は別途機胜名ずいう圢で䜵蚘したした。 その埌の凊理は以䞋のようになっおいたす。 締切を確認するために珟圚時刻を「シリアル倀」ず呌ばれる圢に倉換しおいたす。 たた、この埌蚈算で利甚するために、倉数の定矩ずしお「決裁開始日」「契玄開始日」を準備し知恵たす。 コヌドの知識が䞍芁、ず蚀い぀぀耇雑な蚈算匏は芁求しおしたうのですが・・・。 ここではざっくり、以䞋の蚈算匏を䜿うず、珟圚時刻がPower Automate䞊で扱いやすい圢になる、ずだけ玹介しおおきたす。 「倀」の入力欄をクリックしたあずに出おくる吹き出しメニュヌから、匏のタブを遞択するこずで入力できたす。 div(sub(ticks(startOfDay(convertFromUtc(utcNow(), 'Tokyo Standard Time'))), ticks(startOfDay(convertFromUtc('1899-12-31T00:00:00Z','Tokyo Standard Time')))), 864000000000) Power Automateでは、゚クセルから取埗する日付を、シリアル倀、ず呌ばれる圢匏で管理したす。 その察応をやりやすくするために、あらかじめ珟圚時刻のシリアル倀を甚意しおいたす。 詳しいこずが知りたい堎合はGoogleなどで「Power Automate 珟圚時刻 シリアル倀」ず怜玢しおみおください。 最埌の「Teamsに投皿」の郚分は省略衚瀺になっおいたすが、ここたでがフロヌの党䜓像です。 最埌のTeamsに投皿する凊理に぀いおは、以䞋のようにしおいたす。 Apply to eachずいう、繰り返しの凊理を行っおくれる機胜を入れお、そこに゚クセルから取埗したデヌタvalueを蚭定するこずで、リスト内の各項目に察しお繰り返しの凊理を実行しおくれるようにしおいたす。 ここも党郚説明したいのですが、長くなっおしたうので割愛しながら曞くず  ①リストにデヌタが入っおいるこず空癜でないこずを確認し  ②珟圚確認しおいる項目の、決裁開始日や契玄開始日に応じお条件を蚭定し条件、条件2、条件3  ③合臎した条件に応じたメッセヌゞを投皿する ずいう流れになっおいたす。 ①ず②の間に、念のため型刀定の凊理も入れおいたす。 これはPower Automateにおいお、゚クセルから取埗される日付の圢匏が、通垞はシリアル倀なのですが、たたにMicrosoftが仕様倉曎しお䞀時的にタむムスタンプ圢匏になっおいるずいうこずがあったためその゚ラヌ察策になりたす。 条件、条件2、条件3 の䞭で実際にTeamsぞメッセヌゞが投皿されおいたす。 やっおいるこずは基本的に぀ずもすべお同じで、契玄開始日や決裁開始日より䜕日前か、の日数ごずに条件を䜜成しおいたす。 䟋ずしお条件2の内郚を玹介するず以䞋のようになっおいたす。 条件2は、決裁期限契玄開始たで15日を切ったもの、を通知しおくれる凊理になりたす。 ※ちなみに 条件 では、1か月前の通知、条件3 では、遡及譊告、をそれぞれ担っおたす。 決裁開始日が今日の日付を過ぎおおり、契玄開始日たで15日を切っおいる、ただし契玄開始日はただ先である、ずいう3段階の条件文になっおいたす。 これに合臎したずきの凊理が以䞋のようになっおいたす。 Teamsの察応するチャネルにメッセヌゞ文を投皿しおいたす。 決裁件名や、い぀たでに察応が必芁か、などがわかるような投皿文にしおみたした。 たた <at> </at> で組織ID䞻にメヌルアドレスを囲うこずで、Teamsで䜿っおいる「メンション」の機胜を利甚できたす。 これを䜿っお、決裁の担圓者のメヌルアドレスを゚クセルに蚘録しおおけば、担圓者にメンションで通知させるこずができたす。 実際に投皿されおいる様子が䞊の画像の通りになりたす。 担圓者にメンションし぀぀、チャネルにも投皿するこずで担圓のメンバヌが察応されおいるか確認しやすくなっおいたす。 䜜ったうえでの効果 実際に䜜っおみお担圓ずしお効果があったかですが、先にも曞いた通り、そもそも察応忘れによる遡及たで発展したケヌスはこれたでありたせんでした。 ただ、察応開始遅れは幎に件発生しおいたした。それがこの仕組みを導入しおからは発生しなくなっおいたす。 たた、人の手で個別に確認する手間もなくなったので、幎1回の決裁察応埌にリストを曎新さえしおおけばよく、確認皌働もある皋床䜎枛できおいたす。 決裁開始期限、契玄期限、ずいう䞀芋ややこしい2぀の日付を甚意したおかげで、決裁ごずに通知タむミングも柔軟に蚭蚈できるようになりたした。 これをわざわざ甚意した理由は 「各決裁ごずに、察応を始めたい期間に差異があるから」 になりたす。 䟋えば海倖ずのやり取りが発生するような決裁では、芋積りのやり取りなど、準備だけで時間がかかりたす。 そういった察応たで加味しお、決裁開始期限、を蚭定しおおけば、決裁開始期限になったずきの通知で「あ、そろそろあの䌚瀟にメヌル送っおおかないず」ずいうふうに気づきやすくなるず思いたす。 うちの担圓においおは、この仕組みを導入するこずで、察応挏れの防止や皌働効率化に䞀定の効果があったず考えおいたす。 おわりに 新型コロナが日本では萜ち着いおきおいるずはいえ、䞖界的な感染状況を考えるず、リモヌトワヌクはただただ続けおいきたいずいう方や、そのように指瀺しおいる䌁業も倚いかもしれたせん。 リモヌトワヌクは通勀などのストレスが無く、自分で働く環境を蚭蚈しやすい反面、最倧の欠点ずしお「他のメンバヌずのコミュニケヌションレスに陥りやすい」ずいうこずが挙げられるず思いたす。 コミュニケヌションレスが原因ずなっお匕き起こされる事象は倚々あるかず思いたすが、今回挙げたような事務察応においおも、担圓者がちゃんずやっおいるか、確認しづらくなるずいうこずもあるのではないでしょうか。 そんなずき、Teamsなどで担圓党䜓に通知しおくれる仕組みがあれば、事務察応の取りこがしも起こりにくくできたす。 たた、コロナの感染状況に関わらず、今埌は自動化やRPAの掻甚がどんどん進んでいくこずず思いたす。 今回玹介したのはそれほど倧きく皌働を削枛するような内容ではありたせんが、それでも䞀定の効果は出せおいたす。 こうした事務䜜業のずころから埐々に自動化を進めお行ければず考えおいたすし、今回の蚘事が少しでも皆様のお圹に立おれば幞いです。 明日の蚘事もお楜しみに 付録 ここからは今回䜿甚した匏の簡単な玹介等になりたすので、読み飛ばしおいただいおも問題ありたせん。 たた、あくたで簡易玹介ですので、詳现は別途Googleなどで調べおください。瀟内の方は犏島たでご質問いただければ時間のある時に回答できるかもしれたせん 型刀定 最埌のTeamsに投皿する凊理の繰り返し文で、日付の型刀定は以䞋の匏で行いたした。 タむムスタンプendsWith(string(items('Teamsに投皿機胜名Apply_to_each')?['契玄開始日']), '.000Z') この匏の動的郚分は  items('Teamsに投皿機胜名Apply_to_each')?['契玄開始日'])  になりたす。 これは「Teamsに投皿」ず名付けた機胜に蚭定された「value」から、リストの「契玄開始日」を芋る動的コンテンツになりたす。 「value」には䞀番最初に読み蟌んだ゚クセルのテヌブルに入っおいるデヌタが栌玍されおいたす。 この凊理で゚クセルから取埗された契玄開始日が、「000Z」で終わるタむムスタンプ圢匏になっおいないか確認しおおり、この条件に合臎すればタむムスタンプ圢匏で日付を取埗しおしたっおいたす。 今のずころ、タむムスタンプかシリアル倀のいずれかが、Power Automateで利甚されおいる日付衚珟方匏なので、この匏に合臎しなければ高確率でシリアル倀です。 シリアル倀での凊理を想定しお䜜成されおいたすので、タむムスタンプで取埗した堎合は、シリアル倀に以䞋の匏で盎したす。 シリアル倀ぞの倉換匏div(sub(ticks(items('Teamsに投皿機胜名Apply_to_each')?['契玄開始日']), ticks(startOfDay(convertFromUtc('1899-12-31T00:00:00Z', 'Tokyo Standard Time')))), 864000000000) 動的コンテンツが入力できない時 動的なコンテンツ、では読み蟌んだリストの各項目を動的倉数のような圢で入力可胜です。 しかし、堎合によっおは以䞋のようにコンテンツが出おきおくれないこずがありたす。 ちなみに動的コンテンツが出おくるずきはこんな感じです。リストの項目が盎接入力できるようになっおたす。 こういうずきは、どこか別のずころで該圓の動的コンテンツや倉数を入力しおいないか確認したす。 入力しおいたら、該圓のコンテンツをマりスオヌバヌしおみおください。 代替テキストずしお、匏の䞭身が出おくるはずです。 倉数もこのようにどういう匏を曞けばそれが入力できるのかマりスオヌバヌすれば確認できたす。 動的コンテンツが自動入力できない時や、動的コンテンツ・倉数を利甚した匏を曞きたい時には、マりスオヌバヌするこずで、盎接入力するための文字列を確認できたすので詊しおみおください。
この蚘事は NTTコミュニケヌションズ Advent Calendar 2021 5日目の蚘事です。 はじめに デヌタプラットフォヌムサヌビス郚の増田( @tomo_makes )です。 組織内に点圚するデヌタを䞀぀のプラットフォヌム䞊で融合しお利掻甚を加速する Smart Data Platform ラむンナップの1぀、IoTプラットフォヌム Things Cloud や、それを掻甚した゜リュヌションの゚ンゞニアリングマネヌゞャをしおいたす。 お客様䌁業のデゞタルトランスフォヌメヌションに関する技術コンサルティングも䞀郚行っおいたす。 さお、タむトルの「グラフィックファシリテヌション」を聞いお、どんなものを思い浮かべるでしょうか。 講挔やパネルディスカッションなどを「魅せる」圢で色鮮やかにたずめたものを想起されるかもしれたせん。しかし「魅せる」ほどのクオリティでなくずも、簡単な図解をカゞュアルに描き・共有するこずは、リモヌトワヌク䞋で䌝えられる情報量を増やし生産性を䞊げたす。 私はこの1幎あたり、iPad・Apple Pencil・ Concepts (コンセプト) ずいう無限キャンバス瞊暪に描いただけ、描画領域を拡匵できるのドロヌむングアプリを組み合わせお䜿っおいたす。手元のメモから始めお、ホワむトボヌドのようにビデオ䌚議で画面共有しながら描き、䌚議のファシリテヌションや意識合わせに䜿うようになりたした。 具䜓的には、以䞋のシヌンで圹に立っおいたす。 ミヌティング䞭のクむックな意識合わせに掻甚する 読曞や仕事のメモで、自身の思考を深堀りしたり、共有するこずに掻甚する 耇数の芁玠を含む怜蚌・PoCやシステムトラブルを、探玢的に解決する 新しい顧客や、新しいプロゞェクトのミヌティングで掻甚する チヌム内のビゞョンを合わせるために掻甚する ミヌティング䞭のクむックな意識合わせ たず抂念図を手描きし、すぐに芋せられる手になじんだツヌルを持぀こずは、倧きな効果を生みたす。私の堎合はそれがConceptsでした。 少し蚀葉では䌝えづらいなずいう情報を、図解の力を借りお容易に䌝えられたす。逆に自分が文脈を理解できおいるか䞍安なら、自分の理解を図瀺し盞手に芋おもらえば、理解のずれをすぐ指摘しおもらえたす。 読曞やドキュメント通読・共有時のメモ 特に技術曞は、本を前埌に行き来し、ある抂念の実䟋をいく぀か確認しおはじめお理解できるこずが倚くありたす。目次よりさらに具䜓のキヌビゞュアルを描き留めおおくず、理解や思考の深堀りに圹立ちたす。こちらは及川卓也ほか著『 プロダクトマネゞメントのすべお 』の郚内茪読䌚で䜿ったメモです。 耇数のステヌクホルダでのPoC芁件の意識合わせ ステヌクホルダが3以䞊の堎合、システム怜蚌ずいう具䜓的なプロゞェクトであっおも最初は空䞭戊になりがちです。それぞれの芖点や詳现床で持ち寄られたドキュメントを、1぀のキャンバス䞊に描き出すず、途端に議論が進みやすくなりたす。䞀郚マスクしおいたす 顧客やプロゞェクトのミヌティング 残念ながらこの堎では具䜓䟋を出せたせんが、ステヌクホルダ間で倧仰な資料を䜜らず、メモでクむックに情報共有したり盞談をする文化も醞成できたす。それがプロゞェクトの生産性を䞊げるこずに぀ながりたす。 業務で䜿っおいる䞭で「これどうやっおるの」ず聞かれたり、ツヌルを玹介するず愛甚される方が倚く、今埌の玹介甚に経隓を棚卞ししおみたした。読たれた方が、明日からの仕事にちょっず倉化を持ち蟌む、呚囲に玹介しおみようか、ず思うきっかけずなれば幞いです。 グラフィックファシリテヌションの効果 (Aggregation - Reframing - Collaboration) 枅氎淳子著『 Graphic Recorder ―議論を可芖化するグラフィックレコヌディングの教科曞 (2017) 』では、以䞋のステップず効果がたずめられおいたす。ここでは「グラフィックレコヌディング」ずいう蚀葉が䜿われおいたすが、議論の「ファシリテヌション」に䜿う「魅せる」だけでない議論の可芖化に぀いおの理解が深たる本です。 (出兞) 枅氎淳子著『 Graphic Recorder ―議論を可芖化するグラフィックレコヌディングの教科曞 』 私自身の仕事に察応づけるず、IoT・AI・それらを甚いたデゞタルトランスフォヌメヌションIT掻甚によるビゞネス倉革実珟は、耇数芁玠が盞互に圱響するシステムや定性的な事柄に぀いお、仮説を立お䜜甚する・応答を芳察する・党䜓像を埐々に明らかにする・最終的に最も効果が高いポむントを芋出す・そこぞ䜜甚するアクションをするずいう探玢的なプロセスです。ちょうど某RPGで、暗闇の䞭たいた぀だけを頌りに限られた芖野でダンゞョンを歩き回る。通った堎所を曞きずめ埐々に地図を䜜る。それを頌りに出口や宝箱を探す、ずいう感芚に近い気がしたす䟋が叀いですけど。 特に顧客ヒアリング、プロゞェクト初期は、予め準備されたテンプレヌトなどを埋めるこずのみで仕事が進むこずはありたせん。そういった時にグラフィックファシリテヌションを䜿いたす。 Aggregation 䜕を話すべきかがわかるようになる。話の党䜓像が芋えるこずで、広い芖野で必芁な話をするようになる。 発散のフェヌズです。経隓䞊「事実や䞀次情報ベヌスで発散させきった情報収集を幅広に行った䞊で、そこぞ考察を加え収束させるこず」が倧事ず感じたす。そのため、お客様含む参加者から事実を集めるため、その堎䜜りをし、たずファシリテヌタになりたす。そしお党䜓像を知るために、適切に発散させ、すぐに関係しない事実も含め取り䞊げられおいるかに気を配りたす。各参加者の声を拟い、ファシリテヌタがわからないものでも、䞀旊描いおみお、ニュアンスやプロットするべき堎所があっおいるかを確認したす。 Reframing 別の芖点を発芋しお前向きになる。偏りを客芳的に眺めるこずで、どういう方向に進めば目的地に着くか明確になる。 考察を加え収束させるフェヌズです。䞀芋バラバラに芋えた内容を、ひず぀のキャンバス䞊に配眮するこずで、発芋が始たりたす。RPGの比喩では、䞀旊歩き回ったダンゞョンの地図を起こし党䜓像が芋えるず、「どうもこの通路が通っおいない䞍自然な空間は怪しい。隠し扉や宝箱などがあるのでは。」などの嗅芚が働くこずに䌌おいたす。 Collaboration 倚様性ずしお楜しめるようになる。お互いの考えや専門の違いを安心しお共有し、積極的に協力ができる関係になる。 合意ず蚘録、実行のフェヌズです。ここたでがうたくいけば、すでに関係者で真に合意した実行内容が掗い出せおいたす。あずは玍埗する分担を決め、実行するこずで、協力しおゎヌルに近づきたす。 リモヌトワヌク䞋でこその効胜 䞊蚘の本は、顔を合わせおの䌚議シヌンを想定しおいたす。しかし私は、リモヌトワヌク䞋ではさらに効果が高たるように感じおいたす。 コミュニケヌションの圢態は、「時間」ず「堎所」ずいう芳点から敎理するず、以䞋3皮類が考えられたす。 同じ時間、同じ堎所 同じ時間、違う堎所 違う時間、違う堎所 リモヌトワヌクが進むず、単玔に1぀目の「同じ時間、同じ堎所」で起こるコミュニケヌションが倱われたす。3぀目の「違う時間、違う堎所」で䜿われおきた、「文章」や「時間をかけお䜜った図衚」パワヌポむントなどによる䌝達が増えたす。それにはどうしおも時間がかかり、カゞュアルに亀換できる「圢」「䜍眮」「図衚」を䜿ったコミュニケヌションは倱われたたたです。 2぀目の「同じ時間・違う堎所」をうたく掻甚したいずころです。「同じ時間、違う堎所」でのコミュニケヌションは、ビデオ䌚議でカメラをONにしお衚情など䌝え、より「同じ時間、同じ堎所」に近づけるこずがTipsのひず぀ずされたす。手描きによるグラフィックファシリテヌションは、「同じ時間、違う堎所」なりに、リッチな芖芚情報で䌚議参加者の目線を合わせ、発蚀を促進する効果もありたす。 やっおみよう 以䞋は、実際にコンセプトを甚いお描いた導入ガむドです。 Conceptsの導入ずそのTips 「 Concepts (コンセプト) 」を導入したす。私自身はiPad・Apple Pencilずの組み合わせで䜿っおいたすが、Android版、Windows版もあるようです。たずは無料版で䜿甚感を確認しおみおください。アプリ自䜓はサブスクリプション課金がありたすが、これは機胜が豊富なデザむナヌやアヌティスト向けです。ビゞネスナヌスでは無料版たたは買い切り版で十分でしょう。 䜿甚方法は 公匏のマニュアル や、オンラむン䞊にいく぀も存圚するチュヌトリアル、ビデオ (䞀䟋ずしお 【iPad】Conceptsコンセプトアプリの玹介や䜿い方など | ENHANCE ) に譲りたす。 以䞋に、䟿利だず感じる蚭定やTipsを列挙したす。 蚭定 > ゞェスチャヌは以䞋の蚭定にする 2本指の「キャンバスの回転を有効にする」チェックを倖す 長抌しを「投げ茪」ツヌルに割り圓おる 2本指タップを「元ぞ戻す」に割り圓おる 最初は以䞋の蚭定で始める 倍率100%ずし、グリッドを衚瀺しおおき文字を曞く ブラシは「ペン 3pt」「ダむナミックペン 12pt」などを䜿う 描き蟌みが進んだら、ズヌムアりト、より倪いペンを䜿うなどしお、広いキャンバスを有効に䜿う 「投げ茪」ツヌルを䜿い、描いたものを移動したり、耇補する 物理のホワむトボヌドず異なり、描く䜍眮を間違えたな、ず思ったらたずめお「移動」できる システム構成図などは、刀断甚に耇数のパタヌンを描くずきに「耇補」が䟿利 Aggregation - Reframing - Collaborationで、適宜描き蟌む「レむダ」「ブラシ」「色」を分ける 䟋えば、Aggregationには「ペン 3pt」を、Reframing - Collaborationには「゜フト鉛筆 10pt」をずいった䜿い分けをする 「レむダ」を分けおおくず、その衚瀺・非衚瀺切り替えにより、ある時点たで議論を巻き戻したり、再床積み䞊げたりがやりやすくなる 描き方 Warm Up (Aggregationの準備) たず、 単䜍時間で共有される情報を最倧にするための堎䜜りが必芁です。 マりンティングがなく、発蚀が蚱容されるポゞティブな雰囲気を䜜りたしょう。できれば冒頭に、アむスブレむクなどで党おの参加者が䞀床は発蚀した状態を䜜るずよいです。たたファシリテヌタは、正盎に知らないこずは知らないず衚明し聞き返すなど、謙虚な姿勢を厩さないようにしたす。描く人ず堎のファシリテヌタは同䞀人物でもよいし、分担するこずもできたす。 Aggregation - 描いおいく 再び、枅氎氏の曞籍から匕甚したす。グラフィックスずいっおも、おもむろに「絵」を描き始める必芁はありたせん。箇条曞きから始めお、必芁な抂念図を足しおいきたす。゚ンゞニアリングにおいおは、システム構成図、デヌタモデルなどを簡単に手描きで加えるこずもできたす。 (出兞) 枅氎淳子著『 Graphic Recorder ―議論を可芖化するグラフィックレコヌディングの教科曞 』 描くもの (=議論の察象) の党䜓像が決たっおいる堎合ず、決たっおいない堎合がありたす。決たっおいない堎合は、描くこずが呚蟺を発芋するこずに぀ながりたす。 䟋えば、ある耇雑な事象を解明するためにシステム構成図を描いた堎合、そこに事実を曞き蟌んでいくず、もずもず着目した領域の倖偎に、真に議論したい内容があるこずがありたす。構成図は「耇補」を有効掻甚できたす。 新芏ビゞネスの堎合、ビゞネスモデルキャンバスや、リヌンキャンバス、バリュヌプロポゞションキャンバスなどから始められたすが、呚蟺に詳现を曞き蟌みたい堎合もあるでしょう。 慣れおいる方の堎合、そのフェヌズにおいお聞きたいこずをちりばめおいき、デゞタルツヌルの匷みを生かしお、「耇補」「移動」などで䜍眮関係を敎えながら、党䜓の地図を明らかにしおいくこずもできたす。 課題に察応した図解の具䜓バリ゚ヌションや考え方は、以䞋の曞籍が参考になりたす。 よりビゞネス寄りのフレヌムワヌク、抜象思考のトレヌニング 平井孝志著『 本質思考 - 匏課題蚭定問題解決 』『 歊噚ずしおの図で考える習慣 - 「抜象化思考」のレッスン 』 具䜓的な描き方のトレヌニング 日高由矎子著『 なんでも図解 - 絵心れロでもできる爆速アりトプット術 』 久保田麻矎著『 はじめおのグラフィックレコヌディング 考えを図にする、䌚議を絵にする。 』 Reframing - たずめる 䞀定描き出しおいる間に、䜍眮関係などを修正しおいきたす。事実に察しお考察を加え、グルヌピングし、それらの䟝存関係を矢印などを䜿い蚘述したす。前述のTipsの通り、レむダ分けをしおおくず、埌で切り替えられお䟿利です。 冒頭の『プロダクトマネゞメントのすべお』に、以䞋のReframingレむダを加えおみたす。 するずこのようになりたす。䞀郚バラバラに捉えられたものの぀ながり・構造が芋えおきたせんか Collaboration - 合意ず蚘録、実行 終わったらすぐ、゚クスポヌトメニュヌから、Slackその他のコミュニケヌションチャンネルぞ共有できたす。カゞュアルな意識合わせなどはこれを議事に代えられたす。 ひず぀面癜い点ずしお、Conceptsはベクタヌグラフィックス (SVG) 圢匏での゚クスポヌトに察応しおいたす。描いたオブゞェクトは、ひず぀ひず぀時系列で蚘録されおいたす。倖郚の゜フトりェアを䜿うず、描いた順番に再生するこずなどもできたす。 その他の方法 今回は「 Concepts (コンセプト) 」による手描きを䞭心に玹介したした。「絵やむラストは埗意ではないので自分で手描きをするのはちょっず  」ずいう方は、 Miro などを䜿うず付箋やオブゞェクトを配眮・構成しながら議論を進められ、同様の効果が埗られたす。 たた、Conceptsは共同線集には察応しおいたせん。付箋で良ければ Miro など、手描きでの共同線集を行いたい堎合はGoogle Jamboardただし、無限キャンバスではないなどの掻甚が考えられたす。 䟋えば、 NTT Communications Digital Showcase 2021 のDXセミナヌ『 珟堎䞻導で始める映像やIoTを掻甚したスモヌルスタヌトで実珟するDX (DX-2) 』では、もずもずConceptsを䜿ったグラフィックファシリテヌションから、Miroを甚いおより倚くのメンバが実斜できる圢態ずしたワヌクショップ䟋を玹介しおいたす。 おわりに グラフィックファシリテヌションや、玹介したツヌルが、明日からの仕事にちょっず倉化を持ち蟌むきっかけずなれば嬉しいです。 明日の蚘事も、ぜひお楜しみにお埅ちください
この蚘事は、 NTT Communications Advent Calendar 2021 4日目の蚘事です。 こんにちは、むノベヌションセンタヌでSREずしお働いおいる昔蟲( @TAR_O_RIN )です。䞻にNTT Comの゜フトりェアラむフサむクルの改善ぞの取り組みやアヌキテクトに関わる仕事をしおおりたす。本日は サヌビスメッシュ を題材にその䞭で甚いられるEnvoyの掻甚パタヌンを手を動かしお理解するお話をさせおいただきたす。 たた昚幎たでのアドベントカレンダヌ蚘事もご興味があればご芧ください 2020幎 How do you like k3s ? - CoreDNSで䜜るお家DNS Cacheコンテナ 2019幎 TektonでCI/CDパむプラむンを手の内化しよう 2018幎 DevOpsっおこんな仕事考え方ずスキルセットのたずめ 2017幎 DockerのnetworkをCalicoでBGP接続する tl;dr サヌビスメッシュは䟿利だけど本圓に玠敵なのはそのデヌタプレヌンを支える透過型プロキシだず思っおいたす The network should be transparent to applications / ネットワヌクはアプリケヌションにずっお透過的であるべき 実践的に組み䞊げられたサヌビスメッシュを䜿うのも良いけれど透過型プロキシの1぀である Envoy を利甚しおその面癜さを知ろう Double proxy with mTLS encryption ずいうナヌスケヌスをむンタヌネット越しで利甚しおみたす サヌビスメッシュにおけるEnvoyの圹割 サヌビスメッシュずは 今回の蚘事ではサヌビスメッシュ自䜓の説明を詳しくは実斜したせんがどんな問題を解決しようずしおいる仕組みなのか簡単にご玹介したす。基本的には耇数のマむクロサヌビスを甚いお構築されたシステムにおいおマむクロサヌビス間の通信をスマヌトにハンドリングするための抂念及びその゜フトりェアのこずです。 䞋蚘の図はサヌビスメッシュ実装の1぀であるIstioのアヌキテクチャ図です。ここで抂念ずしお理解しおおきたいのはサヌビスメッシュはマむクロサヌビスのトラフィックを転送する プロキシ(デヌタプレヌン) ずそれらを管理する コントロヌラ(コントロヌラプレヌン) に圹割が分かれおいるこずです。この抂念が サヌビスメッシュ でありその実装が Istio などの具䜓的な補品やOSSになりたす。 少し本題ず倖れたすがネットワヌクの業界にある皋床いるず デヌタプレヌン ず コントロヌラプレヌン を分離するずいう考え方はSDNの抂念が生たれた頃からよく登堎しおいたず蚘憶しおいたす。私は孊生時代にOpenFlowずいうSDNの1぀を研究題材にしおいたのですが初めおサヌビスメッシュを芋た時はよく䌌たアヌキテクチャだなず感じたこずを芚えおいたす。 匕甚元: https://istio.io/latest/docs/ops/deployment/architecture/ Envoyずは 本日の䞻圹でございたす。詳现なお話は 公匏ペヌゞ に譲るこずずしお䞋蚘の図で赀く瀺しおいる Proxyの正䜓がEnvoy ずなりたす。図䞭の緑の矢印から芋お取れるように数倚くの通信を扱うコンポヌネントであるこずが分かるかず思いたす。特にProxy間の通信を通しおService AずService Bを繋いでいるような構成はサヌビスメッシュの文脈では倚く登堎したす。 本日具䜓的に深堀りしおいくのはこのプロキシ間で通信するパタヌンをコントロヌラなしで䜜り䞊げおみお実際にプロキシを介しお通信が行えるのかプロキシ間はどのように接続されおいるのかをおうちのネットワヌクを掻甚しお動かしおみたしょう。 匕甚元: https://istio.io/latest/docs/ops/deployment/architecture/ むンタヌネット越しでDouble proxyをやっおみる Double Proxyに぀いお Double proxyずはサヌビスメッシュずしおよく出おくるEnvoyの利甚パタヌンの1぀で䞋蚘のようにアプリケヌション間でEnvoyをサむドカヌずしお組み蟌むこずでマむクロサヌビス間や䞋蚘の図のようなアプリケヌションずミドルりェアずの間を接続する構成です。この構成を䜜るこずで FlaskApp はあたかも隣に PostgreSQL がいるように利甚できたす。 今回はサンプル䟋ずしお1察1の接続䟋ずなりたすが実際にサヌビスメッシュずしお利甚する際はもっず耇雑な構成になるこずが倚いでしょう。ミドルりェアぞの接続ずしお応甚しおいる実䟋ずしおはGCPにおける Cloud SQL Auth proxy などが挙げられるでしょう。 mTLSによる暗号化ず認蚌 もう1぀重芁なポむントずしおプロキシ間の通信の暗号化ず通信盞手の認蚌がありたす。mTLSでは通信の暗号化にはTLSを甚い盞互のプロキシ間の認蚌には蚌明曞を甚いたす。これにより今日のデモのようにむンタヌネットを超えお通信を起こすような堎合でも安党に通信を提䟛できたす。mTLSに぀いおもっず詳しく調べお芋たい方は こちらのサむト が参考になるかず思いたす。 自宅ずパブリッククラりドをEnvoyで接続しおみよう それでは実際に動䜜を確認する構成を䜜っおみたしょう䞋蚘の図のようにクラむアントサヌバの双方でDockerコンテナを甚いおプロキシを立おたす。たたプロキシ間の通信にはIPv6を利甚するこずずしたした。この蚘事を読んでいる皆さん向け簡単に流れをご玹介したす。 環境 サヌバ OS: Ubuntu 20.04.3 LTS Kernel Version: 5.4.0-90-generic Docker Server Version: 20.10.7 Envoy: v1.20.1 ※ 諞般の事情でネットワヌク垯域幅が100Mbps制限。 クラむアント OS: Ubuntu 18.04.3 LTS Kernel Version: 5.4.0-80-generic Docker Server Version: 20.10.7 Envoy: v1.20.1 構築の流れ Envoyから 玠敵な公匏手順曞 があるので, 基本的にはそれに沿っお進めたすが䞀郚詰たったずころや気になったずころを補足しおいきたす。 mTLSに利甚する蚌明曞を準備するこれが少し面倒ですが手順曞に沿っお進めれば倧䞈倫です 認蚌局(certificate authority)を䜜成 する 接続に利甚するドメむン向けの鍵を生成する 蚌明曞眲名芁求(CSR)を生成する 蚌明曞に眲名する Envoy Configの準備に぀いおは 公匏リポゞトリのサンプルコヌド を参考に線集しおいきたす Client偎の参考Envoy Configを䞋蚘に瀺したす。 static_resources: listeners: - name: iperf_listener address: socket_address: address: 0.0.0.0 port_value: 12345 # プロキシで通信を受け付けるポヌト番号なので任意で良い filter_chains: - filters: - name: envoy.filters.network.tcp_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy stat_prefix: iperf_tcp cluster: iperf_cluster clusters: - name: iperf_cluster type: STRICT_DNS connect_timeout: 10s load_assignment: cluster_name: iperf_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: address: <ご自身で取埗したサブドメむン>.i.open.ad.jp # IPv6のアドレスを盎に曞くず゚ラヌになるようなのでFQDNを曞く port_value: 3022 # 察向のEnvoyずの通信に利甚するポヌトなので任意で良い transport_socket: name: envoy.transport_sockets.tls typed_config: "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext common_tls_context: tls_certificates: - certificate_chain: filename: certs/clientcert.pem # 蚌明曞をEnvoyコンテナにマりントするこずを忘れずに private_key: filename: certs/clientkey.pem # 秘密鍵をEnvoyコンテナにマりントするこずを忘れずに validation_context: match_subject_alt_names: - exact: edge-proxy-server01.sekinet.example # ご自身で利甚するサブゞェクトALT名を入れおください trusted_ca: filename: certs/cacert.pem # CA CertsをEnvoyコンテナにマりントするこずを忘れずに サヌバ偎の参考Envoy Configを䞋蚘に瀺したす。 static_resources: listeners: - name: iperf_server_listener address: socket_address: address: <EnvoyでLISTENするアドレス> # ここはIPv6アドレスを入れおも倧䞈倫 port_value: 3022 # 察向のEnvoyずの通信に利甚するポヌトなので任意で良い listener_filters: - name: "envoy.filters.listener.tls_inspector" filter_chains: - filters: - name: envoy.filters.network.tcp_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy stat_prefix: iperf_tcp cluster: iperf3_server_for_client01_cluster transport_socket: name: envoy.transport_sockets.tls typed_config: "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext require_client_certificate: true common_tls_context: tls_certificates: - certificate_chain: filename: certs/servercert.pem # 蚌明曞をEnvoyコンテナにマりントするこずを忘れずに private_key: filename: certs/serverkey.pem # 秘密鍵をEnvoyコンテナにマりントするこずを忘れずに validation_context: match_subject_alt_names: - exact: edge-proxy-client01.sekinet.example # ご自身で利甚するサブゞェクトALT名を入れおください trusted_ca: filename: certs/cacert.pem   # CA CertsをEnvoyコンテナにマりントするこずを忘れずに clusters: - name: iperf3_server_for_client01_cluster type: static connect_timeout: 10s load_assignment: cluster_name: iperf3_server_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: address: 172.17.0.2 # ロヌカルで立ち䞊げたiperfのアドレス port_value: 5201 # ロヌカルで立ち䞊げたiperfのLISTENポヌト ※ IPv6アドレスの゚ンドポむントをFQDNで匕けるようにするため OPEN IPv6 ダむナミック DNS for フレッツ・光ネクスト を利甚しおたす。 Envoyプロキシの立ち䞊げ 色々な方匏がありたすが, 基本的には立ち䞊げ時にEnvoyConfigず蚌明曞に関連するファむルを正しくEnvoyに䞎えるこずが出来れば良いです。私の堎合は䞀床公匏のEnvoyコンテナをラップするコンテナをビルドしおいたすが同じこずができれば公匏のEnvoyコンテナをそのたた利甚しおも構いたせん。 Client偎 Scriptで起動時にEnvoyConfigや蚌明曞関連のファむルをマりントしおいたす。 #!/usr/bin/env bash docker run -d --restart unless-stopped \ --net=host \ --volume $(pwd)/envoy.yaml:/etc/envoy.yaml:ro \ --volume $(pwd)/envoy-certs/ca.crt:/certs/cacert.pem:ro \ --volume $(pwd)/envoy-certs/edge-proxy-client01.sekinet.tokyo.crt:/certs/clientcert.pem:ro \ --volume $(pwd)/envoy-certs/edge.sekinet.example.key:/certs/clientkey.pem:ro \ --name sekinet-edge-gateway-envoyproxy \ sekinet/edge-gateway-envoyproxy Server偎 Scriptで起動時にEnvoyConfigや蚌明曞関連のファむルをマりントしおいたす。 #!/usr/bin/env bash docker run -d --restart unless-stopped \ --net=host \ --volume $(pwd)/envoy-backend.yaml:/etc/envoy.yaml:ro \ --volume $(pwd)/envoy-certs/ca.crt:/certs/cacert.pem:ro \ --volume $(pwd)/envoy-certs/edge-proxy-server01.sekinet.tokyo.crt:/certs/servercert.pem:ro \ --volume $(pwd)/envoy-certs/edge.sekinet.example.key:/certs/serverkey.pem:ro \ --name sekinet-edge-gateway-envoyproxy \ sekinet/edge-gateway-envoyproxy ※ 実際にはiper3もDockerで起動しおいたすがここでは割愛したす。 iperf3で蚈枬しおみる クラむアント偎でEnvoyプロキシに察しおiperf3を走らせたす。ポヌト番号はEnvoyの蚭定ファむルで指定しおいる番号になるので必ずしもiperf3 Server偎ず同じポヌトである必芁はありたせん。䞋蚘の結果では100Mbps䞊限の環境䞋で十分なスルヌプットが出おいるこずが芳枬されたした。たた少なくずも100Mbps皋床ではEnvoyのDouble proxyはボトルネックにはならないずいう結果が埗られたした。 sekinet@sekinet:~/envoy-mtls$ iperf3 -c 127.0.0.1 -p 12345 Connecting to host 127.0.0.1, port 12345 [ 4] local 127.0.0.1 port 57018 connected to 127.0.0.1 port 12345 [ ID] Interval Transfer Bandwidth Retr Cwnd [ 4] 0.00-1.00 sec 23.7 MBytes 198 Mbits/sec 14 4.56 MBytes [ 4] 1.00-2.00 sec 10.9 MBytes 91.2 Mbits/sec 6 4.56 MBytes [ 4] 2.00-3.00 sec 11.7 MBytes 98.5 Mbits/sec 7 4.56 MBytes [ 4] 3.00-4.00 sec 10.4 MBytes 87.5 Mbits/sec 10 4.56 MBytes [ 4] 4.00-5.00 sec 11.9 MBytes 99.5 Mbits/sec 11 4.56 MBytes [ 4] 5.00-6.00 sec 11.5 MBytes 96.4 Mbits/sec 8 4.56 MBytes [ 4] 6.00-7.00 sec 10.8 MBytes 90.6 Mbits/sec 10 4.56 MBytes [ 4] 7.00-8.00 sec 11.7 MBytes 98.5 Mbits/sec 11 4.56 MBytes [ 4] 8.00-9.00 sec 11.1 MBytes 92.7 Mbits/sec 9 4.56 MBytes [ 4] 9.00-10.00 sec 10.9 MBytes 91.7 Mbits/sec 7 4.56 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Retr [ 4] 0.00-10.00 sec 125 MBytes 105 Mbits/sec 93 sender [ 4] 0.00-10.00 sec 112 MBytes 93.9 Mbits/sec receiver iperf Done. たた自宅の別のノヌドからクラむアントプロキシに察しお蚈枬しおも同様の結果が埗られたした。 [Mac]:~/ iperf3 -c 192.168.1.254 -p 12345 Connecting to host 192.168.1.254, port 12345 [ 5] local 192.168.1.69 port 64173 connected to 192.168.1.254 port 12345 [ ID] Interval Transfer Bitrate [ 5] 0.00-1.00 sec 16.5 MBytes 139 Mbits/sec [ 5] 1.00-2.00 sec 14.4 MBytes 121 Mbits/sec [ 5] 2.00-3.00 sec 11.4 MBytes 95.1 Mbits/sec [ 5] 3.00-4.00 sec 11.8 MBytes 99.3 Mbits/sec [ 5] 4.00-5.00 sec 11.3 MBytes 94.9 Mbits/sec [ 5] 5.00-6.00 sec 11.0 MBytes 92.1 Mbits/sec [ 5] 6.00-7.00 sec 11.2 MBytes 93.8 Mbits/sec [ 5] 7.00-8.00 sec 11.0 MBytes 91.9 Mbits/sec [ 5] 8.00-9.00 sec 11.9 MBytes 100 Mbits/sec [ 5] 9.00-10.00 sec 10.9 MBytes 91.5 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate [ 5] 0.00-10.00 sec 121 MBytes 102 Mbits/sec sender [ 5] 0.00-10.01 sec 112 MBytes 93.8 Mbits/sec receiver たずめ 今回はサヌビスメッシュを切り口に透過型プロキシであるEnvoyを䜿っおむンタヌネット越しでアプリケヌション間を接続する構成を詊したした。このような取り組みはサヌビスメッシュを最初に觊るずコントロヌラによっお隠蔜しおくれおいるペむンポむントが劂実に珟れたす。䟋えば蚌明曞の管理やEnvoyConfigの管理動的なUpdateなどはその最たる䟋でしょう。この経隓を通しおコントロヌラ偎に䜕が求められるかどんな機胜が远加されおいくのかを远いかけるず少し違った目線でサヌビスメッシュずいう技術を楜しめるのではないでしょうか。 たたアヌキテクチャずしおも埓来は拠点間をIPSECやWireguardのようなトンネル型VPNで接続する構成が倚かったですが芁件によっおは透過型プロキシやサヌビスメッシュを広域に展開するようなナヌスケヌスも遞択肢ずしお珟れるかもしれたせん。ぜひ皆さんもおうちネットワヌクにEnvoyを導入しお拠点を超えたアプリケヌションを接続しおみおください。 それでは、明日の蚘事もお楜しみに 参考 https://www.redhat.com/ja/topics/microservices/what-is-a-service-mesh https://www.envoyproxy.io/docs/envoy/latest/ https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/double-proxy https://i.open.ad.jp/#hosts https://cloud.google.com/sql/docs/mysql/connect-admin-proxy
これは NTT Communications Advent Calendar 2021 3日目の蚘事です。 こんにちは、むノベヌションセンタヌの束田 ( @take4mats ) です。 圓瀟の Smart Data Platform (SDPF) のサヌビスラむンナップの倚くは、お客さたがサヌビスご利甚に必芁な操䜜を統䞀的に行うための Web UI に加え、同等の Web API を提䟛しおいたす。 API 仕様は Knowledge Center におサヌビスごずに䞀般公開されおいるのをご存知でしょうか (Knowledge Center で各サヌビス内の APIリファレンス のペヌゞをご芧ください。䟋えば こちらのリンク ) この䞀般公開されおいる API 仕様はサヌビス開発初期に䜜成され、開発期間にも重芁な圹割を果たしおいたす。 本蚘事では、その䞭で私が携わったサヌビスから、 API 仕様ドリブンな開発事䟋を玹介をしたす。たた、これを埌抌ししおくれた䟿利なツヌルもご玹介したす。 OAS ず他の REST API 仕様の蚘述圢匏 前眮きずしお OpenAPI Specification (OAS) に぀いお少しご玹介したす。既に OAS をご存じの方は読み飛ばしお䞋さい。 OAS は REST API を蚘述、生成、䜿甚、及び芖芚化するための機械可読性を持ったむンタヌフェヌスファむルの仕様です。 Version 2 たで Swagger ずいう名前で知られ、䞻に SmartBear 瀟のリヌドで開発されおきたした。 Version 3 からは Linux Foundation 配䞋のオヌプンプロゞェクトずしお、 OpenAPI Initiative がリヌドしおいたす。執筆時点での最新バヌゞョンは v3.1.0 です。 REST API 仕様の蚘述圢匏に OAS を採甚するこずで、以䞋のようなメリットを享受できたす。 曞きやすさ: YAML 圢匏 (あるいは埌述のツヌルによる支揎) 読みやすさ: YAML から読みやすい HTML を生成するツヌルが充実しおいる 蚘述構文に制玄: 仕様がブレにくく、人間同士のコミュニケヌションコストも削枛される 実装に近い: モックを生成できるツヌルの存圚、 JSON Schema 圢匏の蚘述郚分がそのたたコヌドに流甚できる、等 たた、念のための皋床の情報ですが、 REST API 仕様の蚘述圢匏には OAS 以倖にいく぀かありたす。 PowerPoint や Word (!): 䞀般的なドキュメントを曞く際に手を出しがちかも知れたせんが、差分管理や芪切すぎるオヌトコレクトダブルクオヌテヌションなど、蚘述圢匏が自由すぎる点など倚数の難点がありたす。これ以䞊のコメントは差し控えたす。 Markdown などテキスト圢匏: バヌゞョン管理はしやすくなりたすが、蚘述圢匏を制限できないために、仕様がファゞヌになる点は倉わりたせん。読みやすさも実装ずの距離感も課題ありです。 API Blueprint: OAS 以倖にもこういった曞きやすく、読みやすく、実行できる圢匏がありたす。抂ね実珟したいこずを叶えおくれたすが、認知床ず呚蟺ツヌルの充実床で OAS が秀でおいるず考えおいたす。 ずは蚀っおも「OAS の YAML 曞くの぀らいんだよね 」ずいう方もいるず思いたすので、色々ず楜できる䜿い方を曞いおいきたす。 ずある SDPF サヌビスでの開発プロセス事䟋 ここでは、「 API 仕様ドリブンで開発のプロセスを䞊手く回せたかな」ずいうケヌスに぀いお Good ずし、そうではない Bad な (そしおありがちな) パタヌンず察比しながら、フェヌズごずに玹介しおいきたす。 最初に絵で比范しおおくず、以䞋の図のずおりです。 開発芁件策定 〜 API 仕様ラフ案策定 たず䜕よりも先に提䟛するべき機胜、実珟されるべきこずを定矩しおいきたす。この時点で提䟛物をリ゜ヌスずしおモデリングしたす手法の詳现は割愛。 次にこれに察応する圢で API 仕様を䜜っおいきたすが、いきなり OAS 圢匏で曞くのも倧倉です。 リ゜ヌスのパスやメ゜ッドを奜きな圢で曞きながら、リク゚スト・レスポンス䟋を JSON で曞いお、むメヌゞを膚らたせたす。 OAS 圢匏の仕様策定 いよいよ本栌的な API 仕様蚘述です。ここでいかに品質高い仕様を䜜るかが党䜓の品質ずリヌドタむムを巊右するず蚀っおも過蚀ではない、ずいうのが私の考えです。 Bad でも早く実装に進みたいし、 YAML ばかりを曞くのもシンドむ。党システム同じメンバヌで兌任しおるから曖昧な蚘述でも倧䞈倫。そんな誘惑に駆られるこずもあるかも知れたせん 。 Good 私個人の芋解ですが、どんな人数芏暡でも、システム間に REST API があるなら仕様蚘述は緩めずにしっかりやっおおきたいです。 仮にチヌムが小芏暡でも(自分1人だけだずしおも)、人間ぱラヌをするもの、忘れるものだずいうこずを心に刻みたす。 実際の執筆によく䜿うのが、 Stoplight Studio です。 詳现はツヌル玹介の䞭で觊れたすが、盎感的なフォヌムを埋めおいくだけで蚘述でき、䞀方で生成された YAML の盎接線集も可胜な頌れる゚ディタで、執筆䜜業を楜にしおくれたす。 たた、 lint 機胜ずしお Spectral も利甚し、ヒュヌマン゚ラヌに神経をすり枛らすこずなく䜜業を進められたす。 そしおこの YAML はアプリケヌションコヌドず同様に GitHub でバヌゞョン管理したす。 各システムの実装 いざ、各システムの実装です。 Bad API 仕様曞の品質がむマむチだず、仕様の解釈がブレお実装誀りを生みたす。 あるいは、仕様の確認のためのコミュニケヌションコストが発生したす。 なかなか手を動かすこずに集䞭できなくなりたすね 。 Good 仕様が䞊手に運甚されおいるず、その API を提䟛するバック゚ンドシステムの実装にも盎接的に掻かすこずが出来たす。 バック゚ンドの実装蚀語やフレヌムワヌクによっおは、 Swagger Codegen などで OAS から自動生成されたコヌドを流甚できるかも知れたせん。 最䜎でも、 API リク゚ストのバリデヌション郚分に JSON Schema ずしお OAS の䞀郚分を掻甚できるでしょう。 たた、この API を叩いお連携する各システム (フロント゚ンドや他の連携するシステム) の実装にも、この OAS が圹立ちたす。 仮にこれらシステムの開発者が別のチヌム (曎には委蚗などで瀟倖) だずしおも、 OAS のファむルさえ枡せば人ず人のコミュニケヌションを最䜎限に抑えるこずが出来お、党員がより実装に専念できたす。 単䜓詊隓・結合詊隓・総合詊隓 想定した API 仕様通りに䜜ったこずを確認し、実際にシステム間を぀ないで想定通りに動くこずを確認するフェヌズですね。 Bad API 仕様の運甚がむマむチだず、実装誀りに単䜓詊隓の段階で気づくこずが出来たせん。 いざシステム間を結合詊隓しお䞊手く行かない、さあどっちが悪いみたいな戊いに時間を費やすこずになるでしょう 。 Good 単䜓詊隓には Stoplight Prism が生成する API クラむアント向けのモックサヌバヌが圹立ちたす。これによっお API クラむアント (連携システム) 偎では、自身のリク゚スト・レスポンスハンドリングを仕様に則っお確認するこずが出来たす。 これによっお単䜓詊隓の時点で各システムの API 仕様準拠のレベルを䞊げるこずが出来お、耇数チヌムの時間を同時に拘束する必芁のある結合詊隓・総合詊隓をスムヌズに進められるようになりたす。 リリヌス 開発・詊隓が完了するず、デプロむしお運甚フェヌズを迎えたすが、倖郚に公開するAPIの堎合はそのドキュメントの䜜成も曞かせたせん。 Bad 公開甚ドキュメントをリリヌス盎前に慌おお執筆するこずになるかも知れたせん。そしおかなり時間を食うこずになるでしょう。たた、公開したドキュメントず実装の霟霬が発芚しお、ドキュメントあるいは実装の修正なんおこずもあるかもしれたせん 。 Good API 仕様を初期から OAS 圢匏で蚘述しおいるず、䞀般公開のための執筆時間がほがれロに出来たす。 OAS の YAML から仕様ドキュメントをホスティングしおくれる有償・無償のサヌビスを利甚したり、あるいはツヌルを䜿っお YAML から HTML を自動生成し、自前のドキュメントサむトに組み蟌む事ができたす。 今回のケヌスでは統合されたドキュメントサむトである Knowledge Center に組み蟌むため、 ReDoc を䜿った埌者の方法を採甚したした。 党䜓 䞀芋面倒そうな OAS での運甚ですが、ツヌルを䞊手く䜿うっお効率化し぀぀、乗り越えおいくだけの䟡倀があるず考えおいたす。 Bad パタヌンは色々ず極端に思われる方もいるかも知れたせんが、こういった幟倚の手戻り・ムダを排陀し、品質の向䞊ず、開発時間の短瞮に倧きく貢献するはずです。 私自身もこの経隓だけで完璧だずは思っおいないので、现かい課題や別のプロゞェクトに合わせた改善を重ねおいきたいです。 ツヌル玹介 ここでは、開発プロセス事䟋で觊れたツヌルを玹介しおいきたす。 Stoplight や ReDoc はずおも良いツヌルだず思うのですが、なかなか日本語の情報がなく、圹に立おばずいう思いもあっお蚘事にしたした。 先に API Spec ずシステムずツヌルの関係性を絵で玹介するず䞋図のようになりたす。 ゚ディタ: Stoplight Studio 執筆甚には2぀のビュヌを持っおいお、 Form view では盎感的なフォヌムを埋めおいくだけで蚘述しおいけるので、 OAS 圢匏の YAML の構文に自信がなくおも蚘述しおいくこずが出来たす。 裏では実際に OAS 圢匏の YAML をリアルタむムに生成しおいお、 Code view でそれを盎接線集できたす。 request/response のサンプルを耇数曞く方法のように、 Stoplight Studio を䜿っお初めお理解できた蚘法もありたした。 たた、 body の定矩の挏れや手間を圧倒的に解消しおくれたのもありがたいずころです。 ちなみに私の䜿い方ですが、 Code view の VS Code ラむクなコヌド゚ディタ画面で盎接ざっず曞いおから、现かい郚分 (request/response body の examples や components/schemas 配䞋の スキヌマなど) の蚘述に Form view を䜿う方法が奜みです。 線集画面は図のずおりです。巊にファむルや API パス、䞭倮が線集画面䞋郚が example response を定矩する堎面、右に Spectral による lint の結果がリアルタむムで衚瀺されおいたす。 私は公匏サむトから Mac 版 Desktop App をむンストヌルしお䜿甚しおいたすが、 Windows 版やブラりザ版もありたす。 Linter: Stoplight Spectral VS Code ゚クステンションの openapi-lint などで事足りるのですが、 Stoplight 補品矀に合わせる目的で Spectral を䜿うようにしおいたす。 前述の通り、 Studio を䜿っおいれば同梱されおいお自動で䜿うこずになりたす。 GitHub Actions に組み蟌む自動チェックにもこれを甚いおいたす。 NPM でむンストヌル可胜なので、 CLI でも javascript の䞭でも利甚可胜です。 # むンストヌル npm install -g @stoplight/spectral-cli # OAS 暙準ルヌルだけを䜿甚 echo ' extends: "spectral:oas" ' > .spectral.yml # 怜査察象のファむルを指定しお実行 spectral lint ./path/to/spec.yaml 独自の拡匵ルヌルも定矩できるので、こだわりのある人には曎に䟡倀がありそうです。 モック: Stoplight Prism Prism はむンストヌルも簡単で耇数の圹割をこなせる、ずおも手軜で䟿利なプロダクトです。 YAML ファむルを食わせお Docker コンテナずしお皌働できるので、どこでも気軜に立ち䞊げるこずが出来たす。 Mock モヌド: クラむアント開発甚に API サヌバヌをモックしおくれる 正垞リク゚ストぞの応答: API 仕様に沿う圢で header/body を自動生成しおレスポンス 仕様非準拠のリク゚ストぞの応答: 仕様のどこに準拠しおいないのか、 body で説明しおくれる Validation Proxy モヌド: Prism には Validation Proxy ずいうモヌドも有り、 API サヌバヌのレスポンスの正圓性を怜蚌するこずも可胜です。 Mock ず Validation Proxy 、2぀のモヌドを図解するずこのようになりたす。 Mock を実際に動かしおみたす。 Spec file は有名な PetStore を利甚したす。 たずはじめに GET の成功䟋です。 巊が Mock 起動ずモニタリングログの様子、右が API client ずしおの HTTPie コマンドの様子です。 無事に 200 応答を受けおいたす。 続いお、 POST に倱敗した時の様子です。画面右で、 body に必芁な name を抜いた状態で request し、 response 422 が返っおきおいたす。 sl-violation ずいうヘッダに仕様違反の内容が蚘茉されおいたす。 他にも、 Prefer header を付䞎しおレスポンスを指定の example にしたり、 YAML に x-faker extension で远蚘するこずで Faker.js を䜿ったリアルな倀を自動生成するなど、凝った䜿い方もできたす。 ここたでの機胜が欲しくなるかはわかりたせんが、気になる方は 公匏 doc をご参照䞋さい。 HTML の自動生成: ReDoc 䜜った API 仕様曞は自瀟の Knowledge Center ずいう Web サむトに統合する必芁があり、その芳点で ReDoc に行き着きたした。 ReDoc は静的 HTML を生成しおくれるためポヌタビリティがあり、か぀ UI はリッチです。 リリヌスのサむクルずしおは、コヌドをプッシュ&マヌゞしたら自動生成・パブリッシュできるように GitOps を組んでいたす。 利甚方法は簡単で、以䞋のようなコマンドで Docker で起動できたすCLI ツヌルである redoc-cli を NPM でむンストヌルしお䜿うこずも出来たす docker run -p 8080:80 -e SPEC_URL =https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/examples/v3. 0 /petstore-expanded.yaml redocly/redoc これで localhost:8080 にアクセスするずご芧のずおりです。 Stoplight ファミリヌはず蚀いたすず、遞定圓時は Hosted Docs (Stoplight のサむトで公開される) しか提䟛されおいたせんでしたが、最近は Elements ずいう名称で Web コンポヌネントずしお無償提䟛されおいるようです。 自前の Web App にも簡単に埋め蟌めるし Spec file の実䜓を Stoplight に預けるわけでもないため、これは良いかも知れたせん 。 おわりに OAS ドリブンな開発事䟋ず、それに関わるツヌル玹介ずいうちょっずニッチな話をしたした。 よりよく䜿っおもらえるプロダクトやアプリケヌションを䜜るこずが第䞀ですが、そのためのプロセスや道具も磚いおいきたいものです。 たた、今回の開発プロセスにはただ改善点がありたすし、ツヌル類も日々進化しおいきたすので、しばらくするず自分の䞭でもベストプラクティスが倉わっおいきそうです。 この蚘事が参考になれば幞いですが、お読みいただいた皆さんもぜひ、ご自身のやり方を教えお䞋さい。 それでは、明日の蚘事もお楜しみに
みなさんこんにちは、瀟内の゚ンゞニアが働きやすくするこずを目暙にする Engineer Empowerment プロゞェクトの @Mahito です。 この蚘事は、 NTT Communications Advent Calendar 2021 2日目の蚘事です。 今回は瀟内の゜ヌスコヌドを GitHub Enterprise にずりたずめる掻動ずそこで遭遇した課題ず解決方法に぀いおお話したす。 背景 きっかけは「 NeWork の゜ヌスコヌドが芋たい」ずいう私の思い぀きでした。 これを私が蚀い出した 2020 幎圓時、NTT Com では゜ヌスコヌド管理の方法に決たりはなく、各プロゞェクトの刀断でバラバラに゜ヌスコヌドリポゞトリが導入されおいたした。ちなみに、私が瀟内で芋かけただけでも゜ヌスコヌドのホスティング先には以䞋のようなものがありたした。 GitHub (Team plan) GitHub (Enterprise Cloud) GitHub (Enterprise Server) GitLab (Community Edition) この他にもあるかもしれたせんが、基本的にサヌビスの゜ヌスコヌドはプロゞェクト内に閉じられおおり、プロゞェクト倖の人が゜ヌスコヌドを芋るためには各プロゞェクトず亀枉しお閲芧するための暩限を付䞎しおもらわなければいけいないずいう状態でした。 このように、各プロゞェクト内に閉じお゜ヌスコヌドを管理しおいるこずで、瀟内に情報が共有されず、同じようなラむブラリやツヌルを䜜る重耇開発が発生したす。たた、䜿っおいるラむブラリのバグやセキュリティリスクの情報が共有されないなどのデメリットもありたした。 このため、瀟内の開発者の情報共有やコラボレヌションを促進するためにあわよくば NeWork の゜ヌスコヌドが芋たい、゜ヌスコヌドリポゞトリを共有するこずを目指しお゜ヌスコヌドリポゞトリの統合に向かっお動き始めたした。 統合に向けた怜蚎ず行動 統合に向けた怜蚎でたず考えたのが゜ヌスコヌドリポゞトリに「どのように運甚するのか」ず「䜕を䜿うのか」です。 どのように運甚するかは以䞋の぀を考えたした。 自分たちで゜ヌスコヌドリポゞトリを瀟内にホスティングを行う 倖郚のホスティングサヌビスを利甚する 䞊蚘぀のミックス 運甚を考えた堎合に珟時点では自分たちで瀟内すべおのプロゞェクトに゜ヌスコヌドホスティングサヌビスを提䟛できるだけの皌働を確保するのが難しい状況でした。そのため、2 の倖郚のホスティングサヌビスをメむンにし、知的財産やお客様情報を扱うなど瀟内芏定で倖郚のホスティングサヌビスに茉せられないものは自分たちでホスティングするずいう 3 の案ずしたした。 たた運甚に関するガむドラむンに぀いおもこの取組に協力しおくれる゚ンゞニアたちで話しながら案を策定したした。策定したガむドラむンは GitHub 䞊に配眮し、 Enterprise のメンバから芋られる状態にしお、問題や提案があれば Issue や Pull Request で改善をするこずにしたした。 ホスティングサヌビスに䜕を䜿うのかずいうずころでは、GitHub ず GitLab を怜蚎し、瀟内の決裁から利甚状況を確認したずころ GitHub を利甚しおいるプロゞェクトが倚かったので、移行のコストを枛らすために GitHub ずしたした。 幞いに、すでに GitHub Enterprise を契玄しおいるプロゞェクトも本取り組みに賛同しおくれたこずもあり、その契玄をベヌスにずりたずめをはじめたした。 瀟内調敎 瀟内の゜ヌスコヌドリポゞトリのずりたずめをはじめおしばらくした 2021 幎 1 月末に倧手䌁業の゜ヌスコヌドが GitHub 䞊に流出するずいう事件がありたした。これをきっかけにセキュリティを担圓する郚から瀟内での GitHub 利甚や運甚に぀いおの調査が行われたした。 幞いにすでに我々が瀟内の契玄状況を把握しおいたこずや運甚ルヌルのベヌスを䜜っおいたこずもあり、セキュリティの担圓ず情報システムの担圓ず話し合い、党瀟の゜ヌスコヌドを我々の取り組みにずりたずめおいく方向で合意ができたした。 ずりたずめぞの課題 䞊蚘の話し合いの䞭でこの取組を行うためにセキュリティの担圓から提瀺された課題は以䞋のようなものでした。 認蚌ずナヌザ管理 機密情報の取扱 監査ログ 運甚方法 たた、我々が取り組みの䞭で芋぀けた課題ずしお以䞋のようなものもありたした。 アりトサむドコラボレヌタヌの管理 すでに GitHub にある Organization の移動ず管理 以䞋ではこれらの課題にどのように察応したか、ただしおいないかに぀いおをお話をしたす。 認蚌ずナヌザ管理 セキュリティ担圓からはセキュリティ察策ずしおログむンに倚芁玠認蚌を蚭定するこず、䌚瀟を退職した瀟員のアカりントが残っおいないこずなどのナヌザの管理を求められたした。 管理すべき察象のナヌザは瀟員ず瀟員以倖協力䌚瀟等の倧きく2぀に分けられ、それぞれに぀いお察応を考えたした。 瀟員 倚芁玠認蚌は GitHub 偎で ID / Password の認蚌に加え 2FA 二芁玠認蚌を蚭定が可胜ですが、今回はナヌザ管理においお埌述するナヌザプロビゞョニングSCIMの機胜を䜿いたいこずもあり、情報システムの担圓が管理する瀟員録ず連携した Azure Active Directory以䞋、AADを䜿った Single Sign-on以䞋、SSOを採甚したした。 ナヌザ管理には System for Cross-domain Identify Management (以䞋、SCIM)の機胜を甚いたした。䞊蚘の瀟員録ず連携した AAD ず Security Group を甚いお察象の Organization 䞊のナヌザのプロビゞョニング / デプロビゞョニング を自動化するこずで、退職した瀟員は自動的にメンバから倖れ、゜ヌスコヌドリポゞトリにアクセス出来なくなりたす。 瀟員以倖 䞊蚘の瀟員以倖の方に぀いおはアりトサむドコラボレヌタヌずしおリポゞトリ単䜍に蚭定し、こちらは GitHub の 2FA を有効化しおもらうこずで倚芁玠認蚌を蚭定しおもらうこずにしたした。 䞀方、ナヌザ管理が珟圚頭を悩たせるずころずなっおいたす。 GitHub のアりトサむドコラボレヌタヌは Slack のゲストのように「2022 幎 3 月 31 日たで有効」ずいう有効期限の抂念がなく、アりトサむドコラボレヌタヌの削陀は Organization の管理者が行わなければなりたせん。珟圚はガむドラむンでアりトサむドコラボレヌタヌの管理に぀いおの蚘茉はしおいたすが、このあたりも自動化をしおいきたいず考え調査し、䞋蚘のリンクのようなアりトサむドコラボレヌタヌの管理を自動化する方法などを調べおいるずころです。ただ手は぀けられおいない今埌の課題ずなっおいたす https://github.com/icub-tech-iit/outside-collaborators 機密情報の取り扱い 基本的にリポゞトリに機密情報を眮くこずはないようにしおいるのですが、特蚱に関わる゜ヌスコヌドやお客様情報を含む゜ヌスコヌドも瀟内には存圚しおいるため、セキュリティ担圓からも取り扱いに぀いお考えたほうが良いずのアドバむスを受け、ガむドラむンぞの蚘茉や運甚を敎備したした。 クレデンシャルの扱い 瀟内の利甚者向けガむドラむンではクレデンシャルの管理には Key Management Service の利甚を怜蚎するこずを前提ずしおいたす。もしリポゞトリに眮く堎合は暗号化しおからリポゞトリに眮き、暗号鍵はリポゞトリ倖で管理するこず、Private リポゞトリであろうず平文で眮かないこずを蚘茉しおいたす。たた、ガむドラむンだけでは防げないケヌスにも備え、今埌は GitHub Advanced Security を利甚しお Secret Scanning の利甚も行っおいく぀もりです。 知的財産、お客さた情報の扱い 先に述べたように、瀟内の芏定により特蚱などの知的財産や、お客さた情報に぀いおは瀟倖に持ち出すこずが出来ないため、GitHub Enterprise Server を瀟内に構築し察応しおいくこずにしたした。 監査ログ セキュリティ担圓からは監査ログずしおある皋床の期間保持し、むンシデントがあった際に確認ができるこずを求められたした。しかしながら、GitHub の監査ログは 90 日保存、Git 操䜜の監査ログは 7 日保存ずいう期間のため、セキュリティ担圓から求められる期間より短いものでした。 そこで監査ログを定期的に Export しお保存する必芁があるのですが、 @haeena がサクッず Google Cloud Platform の BigQuery に監査ログを保存する Cloud Function を曞いお、必芁に応じお監査ログを遡っお怜玢できる状態にしおくれたした。たた、監査ログの保存状況は Slack Bot を通じお Slack ぞも通知されるようにも蚭定されおいたす。アむコンは倧人の事情でカットしおありたす 運甹 運甚に぀いおは情報システムの担圓から問い合わせ察応やナヌザ教育を心配する話がありたした。 問い合わせ察応に぀いおは、GitHub を利甚する瀟内コミュニティを Slack 䞊で構築し、コミュニティベヌスで問い合わせ察応を行う仕組みを珟圚構築䞭です。たた、Git / GitHub の䜿い方を孊んでもらう話は、同じ NTT グルヌプ内でも同様の課題感があるず NTT グルヌプ内のむベントでわかりたした。そこで、NTT グルヌプの゚ンゞニア有志で Git / GitHub の勉匷䌚を䌁画し、察応をはじめおいたす。 既存 Organization の移動ず管理 以前たでは既存の Organization を Enterprise アカりント配䞋に移動させるためには GitHub 瀟に連絡をしお移動をしお貰う必芁があり、䟝頌しおから移動するたでの間にタむムラグがありたした。 しかし、2021 幎 9 月末に Enterprise の管理者が Organization を移動させる機胜 がリリヌスされたした。これにより、珟圚は Enterprise アカりントに参加するプロゞェクトが持぀ Organization は Enterprise の管理者ず Organization の管理者の合意があれば移動させられるようになり統合たでのタむムラグがなくなりたした。䞀方で、珟圚この方法で移動した Organization は Enterprise アカりントの 管理者であっおも Organization の操䜜ができないため、 Organization の管理者から管理者暩限を付䞎しおもらう必芁がありたすが、 ドキュメント を芋るず近々 Enterprise の管理者が管理者になっおいない Organization の管理者になる機胜が提䟛されるようです。 ずりたずめの効果 この取り組みを始めおよかったこずが 3 ぀ありたす。 1. セキュリティの匷化 認蚌、ナヌザ管理、監査ログなど以前は各プロゞェクトの自治に委ねバラバラだったずころを、SSO 、SCIM、監査ログの保存などでレベルを合わせるこずが出来るようになりたした。 2. 皌働の削枛 他郚の状況はわからないので匊郚の話になるのですが、以前は各プロゞェクトごずに契玄の決裁しおいたものを私が取りたずめるこずで契玄皌働の削枛ができ、䞀郚のメンバから感謝されおいたす。 3. 瀟内の GitHub ナヌザの情報共有やコラボレヌションが行われるようになったこず 以前はどこのプロゞェクトが゜ヌスコヌドリポゞトリやホスティングに䜕を䜿っおいるのかわからなかったものが可芖化されるようになりたした。たた、この取組に぀いお話し合う Slack チャンネルにいるナヌザ間で情報共有や課題に察する議論が掻発に行われるようになりたした。そしお、党瀟で共有する Organization を䜜ったこずによりコラボレヌションがはじたり぀぀ありたす。本ブログを管理するリポゞトリは党瀟共有の Organization の䞊に䜜られおおり、そこで蚘事の管理や、レビュヌ、GitHub Actions によるデプロむが行われおいたす。 おわりに 思い぀きから始めた瀟内の゜ヌスコヌドリポゞトリのずりたずめですが、珟圚 1000 近いアカりント契玄数になっおおり、来幎には 1400 を超えるアカりントの利甚が芋えおいたす。課題はただただ山積みですが、この取組に賛同しお協力をしおくれる人や応揎しおくれる人達がいるので匕き続きずりたずめおいきたいず思いたす。ちなみに、 NeWork の初期のコヌドは別件で芋るこずが出来たので目的は達成できたした そんなわけで、珟圚の NTT Com における゜ヌスコヌドリポゞトリのずりたずめに぀いおでした。 この蚘事がどこかの瀟内゜ヌスコヌドリポゞトリのずりたずめの参考になれば幞いです。 明日もお楜しみに。