2021/12/22 平見知久
手持ちの雑プロ等の野良gitレポジトリを整理したくて、gogsを導入してみました。レポジトリ管理であれば言わずとしれたGitHubやAWSのCode commitあたりが有名どころでしょう。が、人様にお見せできないような雑なコードをGitHubで晒すのもアレですし、gitlabあたりはさすがに大げさすぎます(メモリ4GBきっちり持ってくのはきついというか、別のサーバに割り当てたい)。そういう観点でいくとgogsはお手軽でサーバのメモリ的にも優しくていい感じです。
で、手持ちのレポジトリを放りこんでいくのですが、ブランチやタグをちまちま指定していくのはやりたくないところです。漏れも怖いですし一括でやって欲しい。
ということで軽く調べたらちゃんとありました。cloneのときに–mirrorオプションをつけて引っ張ってきます。
git clone --mirror git@XXproject.git
このときcloneしたものはbare形式になります。で、移動先にレポジトリを作っておいて、pushするときも–mirrorをつけます。
cd XXproject.git ; git push --mirror git@dst:project.git
git remote add originとかせずにそのままレポジトリを指定します。これで全部のブランチ・タグもまとめて新しいレポジトリに追加されます。
さすがgit、よくありそうなことはちゃんとあるところが素敵です。
ちなみにgogsの場合、これをGUIからやってくれる移行機能がありましたので今回はそっちで移行してしまいましたが、–mirrorつけるやり方多分どのサービスでも共通で行けると思いますのでメモ兼ねて記事にしておきます。
2021/12/16 平見知久
ここのところホットなLog4jで見つかった脆弱性ですが、Log4j バージョン2.10より前のときの対策で、「JndiLookupクラスをクラスパスから削除する」というのを見て、ぱっと直感的に「抜いて大丈夫なのかな?なんか変な挙動起こさないかな?」と疑問に思ったので軽くソースを覗いてみました。
ちなみにOTRS, OTOBOはperlとJavascriptで書かれたアプリですのでLog4J(というかJava)の脆弱性の影響は受けません。ただ、OTOBOでは検索の高速化の機能のためにElasticsearchと連携できるようになっています。ElasticsearchはJavaでLog4jも使用していますので影響を受けることになります。また、OTRSでも弊社独自で用意したElasticsearch連携のアドオンが存在しており、その関連で気になった次第です。
お断り: 軽くソースを覗いた内容ですので、その真正性はあくまでご自身でご判断ください。本記事を信じて行ったこと/行わなかったことに対するいかなる責任も負いませせん。テストは大事です。
ソースは諸々の事情から、Log4j 2.8.2を使っています。
展開してgrepすると、問題のJndiLookupはlog4j-core.jarの、org/apache/logging/log4j/core/lookup/JndiLookup.javaが該当します。同列のlookupディレクトリを見ると、AbstractLookupを筆頭にDateLookupとか、EnvironmentLookup, JavaLookup等と並んでいますので、おそらくAbstractLookupを基底クラスにしたプラグインっぽい実装になっていそうです。
JndiLookup.javaを見てみると、クラスの出だしが次の通り。
@Plugin(name = "jndi", category = StrLookup.CATEGORY)
public class JndiLookup extends AbstractLookup {
やっぱりAbstractLookupを基底にして、まんまPluginというアノテーションついていますので、扱い的にはプラグイン、と。
そうするとどこからロードしているかが気になりますのでソースに対してgrepかけてみると、テストコードやドキュメント類を除くとorg/apache/logging/log4j/core/lookup/Interpolator.javaがクラスを呼んでいます。
public Interpolator(final Map<String, String> properties) {
this.defaultLookup = new MapLookup(properties == null ? new HashMap<String, String>() : properties);
// TODO: this ought to use the PluginManager
lookups.put("log4j", new Log4jLookup());
lookups.put("sys", new SystemPropertiesLookup());
lookups.put("env", new EnvironmentLookup());
lookups.put("main", MainMapLookup.MAIN_SINGLETON);
lookups.put("marker", new MarkerLookup());
lookups.put("java", new JavaLookup());
// JNDI
try {
// [LOG4J2-703] We might be on Android
lookups.put(LOOKUP_KEY_JNDI,
Loader.newCheckedInstanceOf("org.apache.logging.log4j.core.lookup.JndiLookup", StrLookup.class));
} catch (final LinkageError | Exception e) {
handleError(LOOKUP_KEY_JNDI, e);
}
// JMX input args
他のLookupプラグインはともかく、JndiLookupについてはエラーハンドリングされていて、クラスが読めなかったらhandleErrorで処理しているみたいです。JavaLooupクラス等を抜いてしまうとロード時にエラーで落ちますが、このコードの書き方はない場合にはないなりに動かそうという書き方です。
handleErrorはというと、特に落ちたりせずに警告ログだけ出して終わっています。
private void handleError(final String lookupKey, final Throwable t) {
switch (lookupKey) {
case LOOKUP_KEY_JNDI:
// java.lang.VerifyError: org/apache/logging/log4j/core/lookup/JndiLookup
LOGGER.warn( // LOG4J2-1582 don't print the whole stack trace (it is just a warning...)
"JNDI lookup class is not available because this JRE does not support JNDI." +
" JNDI string lookups will not be available, continuing configuration. Ignoring " + t);
break;
ちなみに、大本のInterpolatorについてはどこから呼ばれてるかというと、何か所かありますが、org/apache/logging/log4j/core/config/AbstractConfiguration.java あたりでクラスのメンバ変数の初期化でばっちり呼ばれています。
private final StrLookup tempLookup = new Interpolator(properties);
AbstractConfigurationの名の通り、Log4Jの設定の基底クラスですから、ライブラリの初期化さえ通ってしまえばまずまず問題はなさそうです。
まとめると
- 問題を起こしているJndiLookupクラスについてはプラグインの1種として扱われている(=必須機能として扱われていない)
- もともと存在しない場合でも大丈夫なようなコードになっている
- ライブラリの初期化さえ通ってしまえば後で問題になる可能性は低い
ということで、提示されている対処通り、「JndiLookupクラスをクラスパスから削除する」という対処で問題なさそうということで個人的には納得です。
ちなみに、クラスパスを削除するといってもJndiLookup.classはlog4j-core.jarの中に入っていますので、実質jarから該当クラスを抜くという操作になります。
いくつか思いついたり探したりした中ではjarは実質zipファイルですので、
# zip -d log4j-core-2.8.2.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
2017/12/25 桜井耕造
誰もがリモートで家電を操作したり、音声で動作させたりする夢の環境にしたいと思ったりすると思うので、現実の技術でどこまで出来るかを書いてみようと思う。(OTRSネタではなくて、すみません。)スマートフォンやGoogle Homeなどから家電製品を操作するためには、スマート家電コントローラが必要になる。Clova WAVEのようにスマート家電コントローラが内蔵されているものもあるが、Google HomeやAmazon Echoなどは、スマート家電コントローラを購入する必要だ。簡単にいうと、エアコン、TV、ビデオ、照明などの赤外線リモコンをこのスマート家電コントローラに記憶させて、このコントローラが代替して、命令するのだ。この設定は、どの機器もスマートフォンで実施する。お持ちのAIスピーカーと連携可否や簡単な特徴を纏めてみたので、ご参考に。(2017年12月25日現在)
スマートコントローラ名 | 価格 | 特徴 |
Nature Remo 製造元:Nature, Inc.(日本) |
¥13,000 | 2017年10月16日発売 ・Google Assistant対応(Google Home) ・AmazonAlexa対応(Amazon Echo) ・家電のリモコンから出る赤外線を登録し、スマートフォンで操作管理 ・応答がどの機器よりも早いらしい。 ・iRKitの後継機で赤外線出力を強化し飛距離を改善した(プログラミング不要) ・iOS10.0以降、Android 5.0以降の機種で設定 ※この製品は入手に予約してから1〜2ヶ月ほどかかる。 |
iRKit 製造元:maaash.jp(日本) |
¥7,700(Amazonにて) | 2014年1月15日発売 ・Google Home対応 ・AmazonAlexa対応 ・プログラミング要 ・家電のリモコンから出る赤外線を登録し、スマートフォンで操作管理・iPhoneアプリで設定 |
REX-WFIREX2 製造元:ラトックシステムとソフトバンク C&S |
¥8,000 | 2017年8月2日発売 ・AmazonAlexa対応(Amazon Echo) ・家電のリモコンから出る赤外線を登録し、スマートフォンで操作管理 ・「REX-WFIREX1」より赤外線出力を強化し飛距離を改善した ・iOS8.4以降、Android 4.4以降の機器で設定 |
RS-WFIREX3 製造元:ラトックシステムとソフトバンク C&S |
¥7,560(税込) | 2017年12月1日発売 ・AmazonAlexa対応(Amazon Echo)・Google Assistant対応予定・家電のリモコンから出る赤外線を登録し、スマートフォンで操作管理 ・iOS8.4以降、Android 4.4以降の機器で設定 |
eRemote RJ-3 Broadlin(中国) |
¥9,617(価格.comにて) | 2015年11月18日発売 ・Google Home対応 ・AmazonAlexa対応・家電のリモコンから出る赤外線を登録し、スマートフォンで操作管理 |
eRemote mini Broadlin(中国) |
¥6,980(Amazonにて) | 2016年11月1日発売 ・Google Home対応 ・AmazonAlexa対応 ・家電のリモコンから出る赤外線を登録し、スマートフォンで操作管理 |
iRemocon 製造元:Glamo(日本) |
¥22,400(Amazonにて) | 2016年12月8日発売 ・Google Home対応 ・AmazonAlexa対応 ・Apple Watchから家電をコントロール ・iPhoneアプリで設定 動作端末はこちら |
Nature Remoについて
私は、スマート家電コントローラの中で反応速度が一番早いと言われる「Nature Remo」を購入してみた。発売日に予約したので、11月初旬ぐらいに納品されてきた。使ってみると、iPhoneのボタンを押して命令したり、Google Homeで命令してから、スイッチが入るまでの時間がかかることが気になる。大体2〜5秒ぐらいかかるのだろうか。リモコンだと瞬時に切り変わるので、数秒でも遅いと気になるかもしれない。あと、Nature Remoは家電から赤外線が届く範囲に置く必要があるので、私はプリンターに貼ってしまった。(ちなみに、近日中にIFTTTを介さずにGoogle Homeに直接接続出来るようになるらしいです。)
リモコンの操作登録(Nature Remo)
①iPhoneで「Remo」アプリをダウンロード
②WiFiに接続
③リモコンボタンを登録
以下の記事の通り、1つずつリモコンのボタンごとに赤外線をかざして登録します。以下のURLを参考にすると良いです。
http://www.itmedia.co.jp/pcuser/articles/1711/30/news058.html
ここまでの設定で、iPhoneで登録したリモコンの操作が出来ます。Google Homeから実行したいときは、IFTTTの設定が必要です。
IFTTTの設定
IFTTTの設定方法は、このURLを参考にすると良いです。先にNature Remoでリモコン操作の登録をしないと設定できません。IF文でGUIで動作条件を設定していく。”that”で”Nature Remo”の登録をすれば、家電を操作出来るようになります。
http://nature.global/jp/ifttt-setup/
まとめ
「電気をつけて」と音声で命令を出してから、照明が点灯するまで3〜4秒ほどかかる。リモコンで操作する方が明らかに早いけど、リモコンを探す手間を考えるとすごく便利です。スマートコントローラによって、レスポンス時間が違うようなので、最新の機器を使った方が良さそうだ。また、近日中にNature RemoからIFTTTを介さずにGoogle Assistantに命令できるようになるみたいで、今後対応済みのファームウェアにアップグレードすれば、もう少しレスポンスが早くなることが予想される。
2017/12/18 桜井耕造
AIスピーカーについて
本年秋ぐらいからAIスピーカーと言われる機器が注目されている。ほぼ各社の製品が出揃い、何ができるか、違いについて纏めてみた。以下の表をご覧下さい。(2017年12月18日現在)
AIスピーカー名 | 販売会社 | 価格 | 特徴 |
Google Home | 定価:15,200円 | ・2017年10月6日発売 ・音楽(Play music)の再生(※1) ・ニュース・ラジオ・Podcastの再生(※1) ・天気予報(※1) ・アラーム・タイマー(※1) ・スケジュールを確認(※1) ・お店の場所や行き方を探す(※1) ・Android携帯を探す(※1) ・Bluetoothスピーカーとして利用(※1) ・GoogleアシスタントからIFTTTに連携(※1) IFTTTに連携ができれば、家電操作(IoT)など色々なことが出来て、メールなどのメッセージを送信できる。 ・Chromecast連携(※1) ・今後Nature Remoと直接連携が可能になる。(将来) |
|
Google Home mini | 定価:6,480円 | ・2017年10月23日発売 ・Google Homeに比べてスピーカー性能(音質)は劣る ・機能はGoogle Homeと同じ(※1を参照) |
|
Amazon Echo Plus | Amazon | 定価:17,980円 | ・2017年11月15日発売 ・Amazon AlexaからIFTTTに連携 ・Fire TV連携予定 ・Amazon Echoよりも音質(高音)が良い ・スマートホームハブ機能が搭載・上記以外はAmazon Echoと同じ機能(※2を参照) |
Amazon Echo | Amazon | 定価:11,980円 (Prime会員7,980円) |
・2017年11月15日発売 ・音楽(Prime Music、Amazon Music Unlimited、dヒッツ)再生(※2) ・ラジオ(TuneIn、radiko)再生(※2) ・カレンダー(Googleカレンダー、Office365、Apple iCloud)の予定の読み上げ(※2)・すき家のお弁当注文、スシローの持ち帰り注文(※2) ・Bluetoothスピーカーとして利用(※2) ・アラーム・タイマー・リマインダー(※2) ・Alexa対応スマート家電連携(※2) ・Amazon AlexaからIFTTTに連携(※2) ・今後Nature Remoと直接連携が可能になる。(将来) |
Echo Dot | Amazon | 定価:5,980円 | ・2017年11月15日発売 ・上記以外はAmazon Echoと同じ機能(※2を参照) |
Clova wave | LINE | 定価:14,000円 2018年1月31日までの期間限定定価:12,800円 |
・2017年10月5日発売 ・音楽(LINE Music)再生(※3) ・ニュース(LINE News)読み上げ(※3) ・ラジオ再生(※3) ・赤外線による家電操作(※3) ・LINEの送信・読み上げ(※3)LINE連携が特徴! ・カレンダー(Google Calnder)の予定の読み上げ(※3) ・おしゃべり(連続会話)(※3) ・Bluetoothスピーカーとして利用(※3) ・内蔵スマート家電コントローラ (Amazon Alexa/IFTTT未対応) ・Google Homeより音響が良い。 |
Clova Friends | LINE | 定価:8,640円 | ・2017年12月14日発売 ・Clova waveに比べてスピーカー性能(音質)は劣る ・LINE通話不可 ・上記以外はClova waveと同じ機能(※3を参照) |
LF-S50G | ソニー | オープン価格 (ソニーストアで24,880円) |
・2017年12月9日発売 ・Googleアシスタントを搭載したスマートスピーカー ・機能はGoogle Homeと同じ(※1を参照) ・防水、音響が良い。 |
G3 VC-GX30 | ONKYO | オープン価格 (価格.comで24,434円) |
・2017年11月30日発売 ・Googleアシスタントを搭載したスマートスピーカー ・機能はGoogle Homeと同じ(※1を参照) ・音響が良い。 |
AISonar | TIS | 未定 | ・未販売 ・議事録作成ができる。 |
音楽を楽しみたいならONKYOのG3 VC-GX30、風呂や台所で利用したいならソニーのLF-S50G、LINEを簡単にメッセージ送信した位ならLINEのClova wave、IoTとして家電を操作したいならGoogle HomeやAmazon Echoというように用途により選択すると良いのかもしれない。
Google Homeについて
まずは、色々と開発すれば実現出来そうなGoogle Homeについて、触ってみた。Google Homeの設定は、Google AssistantというサービスでGmailのアカウントでログインして設定する。従って、Webで設定が可能で、iPhoneやAndroidでもアプリがあるので、設定が可能です。発売日に私が購入した某量販店で「Androidがないと設定出来ません!」と言われたがそんなことはない。
音楽を再生したい時はPlay Musicと連携する設定をGoogle Assistantの設定をすることで、流行りの曲などを流すことが出来る。このGoogle Assistantの機能のみだけでは、家電操作やメール送信、Line送信などが出来ない。それを可能にするのがIFTTT(イフト)というWebサービスで、Google Homeはサポートしている。IFTTTは、各種外部サービスやIoTデバイスを連携させるプラットフォームで、「if~then」という簡易なプログラミング(レシピ)により、動作条件、アクションを定義することで、インターネット経由で動作させることが出来る。IFTTTで連携出来るWebサービスは、一部ですが次のようなものがある。
Google HomeからOTRSへメール送信
Google HomeとOTRSを連携出来ないかなと思い、簡単に出来そうなGoogle Homeへ言った内容をOTRSでチケット生成する仕組みを作ってみたので、簡単に実現方法を紹介する。
①IFTTTにログインする。
②上記の「My Applets」タブを選択し、「New Applet」を押下します。
③「this」を押下します。
④「Choose a service」で「Google Assistant」と入力して、「Google Assistant」のアイコンを押下します。
⑤「Say a simple phrase」のアイコンを押下します。
⑥次の項目を入力して「Create trigger」を押下します。
What do you want to say | 動作のトリガーとなる言葉を定義します。ここでは、Google Homeで受信した言葉です。 |
What’s another way to say it? | 2つ目の動作のトリガーとなる言葉を定義します。 |
And another way? (optional) | 3つ目の動作のトリガーとなる言葉を定義します。 |
What do you want the Assistant to say in response? | 動作トリガーを認識した時にGoogle Homeが応答する言葉です。 |
Language | 「Japanese」を選択 |
⑦「that」を押下します。
⑧「Choose a service」で「Gmail」と入力して、「Gmail」のアイコンを押下します。
⑨「Send an email」を押下します。続いて、「Finish」を押下すると設定完了です。
以上で、OTRSにメール送信されて、チケットを生成することができました。もう少し細かい設定をすれば、システム管理者が障害内容を口頭で簡単にチケットを作成したりできそうです。
次回以降で家電製品をNature Remoに登録して、Google Homeから家電製品を操作する方法をやってみようと思う。
2016/05/30 桜井耕造
通常の運用では、セキュリティ強化のため、公開鍵認証を利用していることが
多いかと思います。しかし、どうしても特定のアカウントのみパスワード認証
を使用したい時があったりしたことはないでしょうか?
そのような時にパスワード認証と公開鍵認証の併用する設定例を紹介します。
testuserはパスワード認証、それ以外のユーザーは公開鍵認証の設定です。
# cd /etc/ssh/ # cp -ip sshd_config sshd_config.20160513 # vi sshd_config 以下のように設定値を変更する。 --- RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no パスワード認証したいユーザー(testuser)の設定をする。 Match User testuser PasswordAuthentication yes --- 設定を反映させます。 # service sshd restart sshd を停止中: [ OK ] sshd を起動中: [ OK ]
これで、testuserのアカウントのみパスワード認証でssh接続が可能になります。
2016/02/29 平見知久
とある案件でWindowsでポートフォワーディングを行う必要がありましたのでやり方含めてご紹介しておきます。
OS: Windows 2008R2
やりたいこと: Windowsサーバにポート中継をさせて、特定セグメントからのアクセスを別セグメントの特定マシンへの通信に振り替えさせる
Linuxですとiptablesあたりを駆使すればそれなりに簡単にできてしまいますし、SSHポートフォワードなんて手もあります。ですが今回は相手はWindows。制約上SSHポートフォワードもNGということでなんかアプリをいれないと駄目かなぁと思って調べていたのですが、実はWindowsのみでポートフォワードすることができます。
ポートフォワードを行うにはnetshコマンドを使用します。
Windowsサーバ(192.168.50.50)の8080ポートを外部サーバ(ここでは192.168.100.100とします)のポート80に転送したい場合、コマンドプロンプトを管理者権限で起動して、以下のように入力します。(画面では2行になっていますが実際には1行で入れます)
> netsh interface portproxy add v4tov4 listenport=8080 listenaddr=192.168.50.50 connectport=80 connectaddress=192.168.100.100
これで、他のマシンからWindowsサーバ(192.168.50.50:8080)へアクセスすると、Windowsサーバ経由で外部サーバ(192.168.100.100:80)に接続できるようになります。
また、netshからはshow allで現在の状態を確認することが出来ます。
> netsh interface portproxy show all
ちなみに削除する場合にはdelete v4tov4コマンドを使用します。
> netsh interface portproxy delete v4tov4 listenport=8080
まあポート転送が必要な状況自体がネットワーク設計的にどうなのよという話があったりなかったりもしますが、既存の制約や限られた時間の中でなんとかしないといけないケースもままあります。知っておくとひょっとすると役にたつかもしれないTipsのご紹介でした。
2014/11/10 平見知久
サポートなんてやっていると、いくつも環境持つことになります。
データがろくに入っていない純粋な検証用なら鍵やアカウント共通でもいいのでしょうが、多少でもデータが入っているとさすがにそうは行きません。SSH鍵やポート、アカウント等はそれぞれ別のものとして管理することになります。
これらのパラメータを楽に管理するために簡単なスクリプトをネタに、bash補完で楽をする方法を紹介します。
まずsshのパラメータを簡単に指定できるスクリプトから。パスの通ったところにsshxという名前で配置し、実行権限をつけておきます。
#! /usr/bin/ruby require 'json' require 'optparse' keydir="~/ssh-keys/" confFile="~/ssh-keys/sshx.conf" # confファイル読み込み confData = "" IO.foreach(confFile) do |line| confData += line end conf = JSON.parse(confData) # コマンドライン解析 opt = OptionParser.new opt.on('-L') do |v| conf.each_key do |k| desc = conf[k]["description"] if desc != nil then print "#{k}: #{desc}\n" else print "#{k}\n" end end exit 1 end opt.on('-ll') do |v| conf.each_key do |k| print "#{k} " end print "\n" exit 0 end opt.parse!(ARGV) setting = conf[ARGV[0]] if setting == nil then print "Invalid confname #{ARGV[0]}. Check sshx -l.\n" exit 1 end cmdline = [] if setting["port"] != nil then cmdline << "-p" << setting["port"] end if setting['option'] != nil then cmdline << "#{setting['option']}" end if setting["pem"] != nil then cmdline << "-i" << keydir + setting["pem"]end cmdline << "#{setting['user']}@#{setting['host']}" exec('ssh',*cmdline)
次に設定ファイルとして、接続先一覧を記述したファイルを~/ssh-keys/sshx.confとして作成します。JSON形式です。
必要ならsshx側のパスを好みの場所に変更してください。sshの鍵(*.pem)も同じディレクトリに配置します。お約束ですがパーミッションに注意して下さい。
{ "dev1": { "host" : "192.168.100.1", "port" : "10022", "user" : "user1", "pem" : "dev1.pem", "description" : "開発環境1" }, "dev2" : { "host" : "192.168.100.2", "port" : "10122", "user" : "user2", "pem" : "dev3.pem", "description" : "開発環境2" }, "fumidai-pf" : { "host" : "192.168.100.3", "port" : "10522", "user" : "dev3", "pem" : "dev3.pem", "option" : "-L8080:localhost:80", "description" : "踏み台(w/PF)" }, "fumidai" : { "host" : "192.168.100.3", "port" : "10522", "user" : "dev3", "pem" : "dev3.pem", "description" : "踏み台" } }
上記の例ですと、dev1, dev2, fumidai-pf, fumidaiをパラメータで指定するとIPやポート、鍵等を適切に選んで接続してくれます。
$ sshx dev1 dev1$
とかやっていると、今度はパラメータを一々手で入れるのが面倒くさくなってきます(苦笑)。
シェルならパラメータは補完して欲しいもの。というわけで、bashの補完機能で補完させることにします。
~/.bashrcあたりに以下を追加します。
_sshx() { CAND=`sshx -ll` COMPREPLY=(`compgen -W"$CAND" $2`) } complete -F _sshx sshx
sshx -llで候補となるパラメータの一覧を表示するようにしているのがミソです。bash提供のcompgenコマンドとの組み合わせで一覧から候補を絞り込んで選択できるようになります。
上記の例ですと、sshx fで、ファイル名の補完と同様にfumidaiまで補完され、さらにを押すとそこから選択可能な一覧(例ではfumidaiとfumidai-pf)が表示されます。
今回は接続先リストを補完させましたが、一覧表示できれば色々と補完させることができます。よく使うコマンド系のパラメータを色々補完させてみるのも一興かもしれません。