投稿

PowerShellでイベントログを取得する時、「指定した選択条件に一致するイベントが見つかりませんでした。」が煩わしいのでcatchする

Follow @venividivici830 Windowsサーバーを点検する時など、イベントログをPowerShellで操作すると便利です。 Get-WinEventコマンドレットでイベントログを取得できますが、指定した条件に当てはまるイベントログがない場合、下記のエラーがスローされます。 Get-WinEvent : 指定した選択条件に一致するイベントが見つかりませんでした。 〜 NoMatchingEventsFound, 〜 NoMatchingEventsFoundが示すように、ただ指定した条件にマッチするイベントがなかっただけなので、条件としてエラーのレベルを「重大」や「エラー」にした場合は、特に問題ないことが多い。 エラーとして赤文字でコンソールに出力されるのは煩わしいので、catchする。 下記は、スクリプトの例。 $ErrorActionPreference = "Stop" $today = Get-Date $from = $today.AddMonths(-1) $filter = @{LogName="system"; Level=1; StartTime=$from} try { Get-WinEvent -FilterHashtable $filter } catch { $category = $Global:Error[0].CategoryInfo.Category.ToString() if ($category -eq "ObjectNotFound") { # 問題ない } else { # Error Handling } } 上の例では、過去1ヶ月分の、WIndowsログ→システムの、エラーレベルが「重大」のログを取得している。 下記の部分のsystemを「application」に変えれば、アプリケーションのログを取得できる。 また、Level=2、3とすることで、それぞれエラーレベルが「エラー」、「警告」のログを取得できる。 $filter = @{LogName="system"; Level=1; StartTime...

macOSからVirtualBoxのCentOSに公開鍵認証でssh接続できるようにする

インストールや、パスワード認証でssh接続できるようにするまでの手順は、下記をご覧ください。 macOS High SierraにVirtualBoxでCentOSをインストールする  macOSからVirtualBoxのCentOSにssh接続するまで  環境は、macOS High Sierra バージョン 10.13.5、Virtualbox バージョン 5.2.12 r122591、CentOS-7 (1804)です。 公開鍵認証とは 公開鍵認証は、ssh接続の認証方式の一つです。パスワード認証とは区別されます。 接続するユーザーが鍵ペアー(秘密鍵ファイルと公開鍵ファイル)を作っておき、サーバー側で、接続を許可するユーザーの公開鍵を登録します。 すると、 サーバーに登録された公開鍵に対応する秘密鍵をもったユーザー(PC)からのみ、接続が可能 になります。 秘密鍵をもったユーザーのみに接続を制限できるので、一般的にパスワード認証より強固と言われます。 クライアント側で、秘密鍵と公開鍵を作成する Mac側(sshクライアント側)で、下記のコマンドを打ち、鍵ペアーを作成します。 鍵のビット数については、manコマンドで-bオプションの説明を確認したところ、default is 2048 bitsとのことだったので、このままにした。 $ ssh-keygen -t rsa 対話的に、下記のように、いろいろ聞かれます。 Enter file in which to save the key (/Users/ user /.ssh/id_rsa):は、鍵ペアーが作成される先のディレクトリーを指定する部分ですが、()内がデフォルトなので、そのままEnterしました。 Enter passphrase (empty for no passphrase):は、パスフレーズ(秘密鍵を使うためのパスワードのようなもの)を指定する部分です。 適当に設定して、Enterします。空はやめたほうがいいです。 Generating public/private rsa key pair. Enter file in which to save the key (/Users/ user /.ssh/id_r...

コマンドラインから、コマンドのカンニングペーパーを参照できる、cheat.shがちょっと面白い

GitHubのTrendingを見ていたら、 cheat.sh というのを見つけました。 コマンドラインから、Linuxコマンドなどのcheat sheet(カンニングペーパー)を参照できるツールです。 ちょっとおもしろかったので、簡単に書きます。 README に書いてあるように、curlコマンドさえあれば使うことができます。 インストールなどは不要でした。 Linuxコマンドだけでなく、プログラミング言語の構文もサポートしており、55のプログラミング言語と、1,000のLinuxコマンドをカバーしているそうです。 curlコマンドを使ってカンニングペーパーが検索されると、100 ms以内でレスポンスを返すことを目標にしているようです。 簡単な使い方は、cheat.sh/の後に、カンニングペーパーを参照したいコマンドを指定して、curlでGETします。 例えば、ssコマンドの場合は、下記の通りです。 $ curl cheat.sh/ss 下記のようなレスポンスが返って来ました。 # Utility to investigate sockets # # Options: #   -4/-6   list ipv4/ipv6 sockets #   -n      numeric addresses instead of hostnames #   -l      list listening sockets #   -u/-t/-x list udp/tcp/unix sockets #   -p      Show process(es) that using socket # show all listening tcp sockets including the corresponding process ss -tlp # show all sockets connecting to 192.168.2.1 on port 80 ss -t dst 192.168.2.1:80 # s...

ロードバランサーを使った構成で、HTTPをHTTPSにリダイレクトする

Follow @venividivici830 X-Forwarded-Protoを使う場合と、使わない場合で、まとめてみました。 AWSだと、 このドキュメント にやり方が書いてありますね。 手元にAWS環境がないから試せないけど、流れとしては、下記のような感じだと思います。 ロードバランサーに対してHTTPでアクセスされても、HTTPSでアクセスされても、バックエンドWebサーバー(ロードバランサーに紐付いたサーバー)の80番ポートに転送する バックエンドWebサーバー側では、 X-Forwarded-Proto リクエストヘッダー を利用して、ロードバランサーに対してHTTPでアクセスされたか、HTTPSでアクセスされたかを判定する ロードバランサーに対してHTTPでアクセスされた場合、URLを書き換える .htaccess の使用は推奨されていない こと、初めて知りました。 VirtualHostを使え と。 下記、上記ドキュメントから引用。 仮想ホストファイルまたは .htaccess ファイルのいずれかで、mod_rewrite ルールを使用します。リダイレクトルールには仮想ホストファイルを使用することをベストプラクティスとして推奨しています。 注: .htaccess の使用は推奨されません。メインの構成ファイルにアクセスできない場合にのみ使用するようにしてください。 Apacheのサイトでも説明されていますね。 一般的に、サーバの主設定ファイルにアクセスできない場合を除いて、 .htaccess ファイルの使用は極力避けてください。 「HTTP HTTPS リダイレクト」とかで検索すると、.htaccessを利用した例がたくさん出てくるので、注意ですね。 X-Forwarded-Protoは、 ここ に説明されていますね。 バックエンドWebサーバーから見ると、ロードバランサーにHTTPでアクセスされても、HTTPSでアクセスされても、(上の例では)バックエンドWebサーバーの80番ポートに転送されるので、クライアントがHTTPでアクセスしたか、HTTPSでアクセスしたかを、RewriteCond %{HTTPS} offとかだと判定できません。 X-Forwarded-Pro...

Windowsで、特定のユーザーに特定のサービスの再起動を許可する

Follow @venividivici830 Windowsで、ユーザーごとに、サービスレベルで操作権限(サービスの開始、停止など)を与える話です。 流れとしては、 scコマンドで、サービスの随意アクセス制御リスト (DACL) に対し、セキュリティ記述子定義言語 (SDDL) 構文で、アクセス制御情報を追加する ことになります。 これにより、あるユーザーはOracleの再起動だけ許可、あるユーザーはTomcatの再起動だけ許可、など、細かい権限設定が可能です。 サーバーのマシン自体の再起動権限は与えられないけど、アプリケーションサーバープログラムや、DBサーバープログラムの再起動だけは許可したい、などのシチュエーションに使えます。 サービスのDACLは、名の通り、サービス単位で権限を制御するためのACLです。 SDDLは、ACLを文字列で記述するための構文です。 「;」で各フィールドを区切る形です。詳細については、 こちら 。に公式ドキュメントg サービスの操作権限をユーザーレベルで制御するには、最低限、下記のように3つのフィールドを設定すれば良いようです。 (許可 (A)/拒否 (D);;アクセス許可の文字列;;; SID ) ;;や;;;って何だよ、と最初見た時思いましたが、フィールドが空で、デリミター(;)だけが並んでいるだけですね。 許可 (A)/拒否 (D) には、サービスに対する特定の操作を 許可する場合はA、拒否する場合はD を設定します。 (許可または拒否する)サービスに対する特定の操作は、 アクセス許可の文字列 で設定します。 このページ に、 アクセス許可の文字列 に設定できる値が一覧されています。 再起動の場合は、RP(Start)とWP(Stop)の操作を許可すれば良いので、RPWP を指定すれば良いです。 SID は、ユーザーオブジェクトに固有のIDで、要はユーザーのIDです。権限を付与したいユーザーのSIDを指定します。 権限を付与したいユーザーで、 コマンドプロンプトからwhoamiコマンドをuserオプション付きで実行することにより、SIDを取得できます。 > whoami /user WIndowsにもwhoamiコマンドがあったんですね。知らなかった。 まと...

Private修飾子で宣言した変数が、編集できるのに参照できない。PowerShellのスコープの変な動き

Follow @venividivici830 Private修飾子で宣言した変数が、functionの中でScript修飾子を介して編集できるのに、参照できない。 環境はmacOS 10.13.5、PowerShell v6.0.2。 ドキュメント 読んだけど、この動きはおかしくないか? test.ps1 function read () { Write-Host ("In function: " + $Script:name) } function write () { $Script:name = "Lennon" } $Private:name = "John" read write Write-Host ("In local: " + $Private:name) 実行すると、 $ pwsh test.ps1 In function: In local: Lennon 確かに下記では編集できているのに、 $Script:name = "Lennon" 下記では参照できていない。 Write-Host ("In function: " + $Script:name) なぜ?

macOSからVirtualBoxのCentOSにssh接続するまで

イメージ
Follow @venividivici830 環境は、macOS High Sierra バージョン 10.13.5、Virtualbox バージョン 5.2.12 r122591、CentOS-7 (1804)です。 CentOSのインストールまでは、 こちら をご覧ください。 以下の例では、ゲストOSであるCentOSを、Macと同じネットワークに属させます。 この場合、VirtualBoxのネットワーク設定で、割り当てをブリッジアダプターにします。 仮想マシンの状態をバックアップ 設定に失敗しても後から元に戻せるように、VirtualBoxのスナップショット機能で、現在の仮想マシンの状態をバックアップしておきました。 スナップショットは、右上のマシンツールから画面を開き、作成ボタンで作成できます。 ネットワークの設定 ゲストOSであるCentOS 7に、固定IPアドレスを設定します。 nmcliコマンドを使います。 NetworkManagerというLinuxのネットワーク管理の仕組みがあり、そのコマンドラインインターフェースがnmcliです。 rootでCentOSにログインし、下記のコマンドを打つと、ネットワークインターフェースenp0s3が、disconnectedとなっていました。 # nmcli device status 下記のコマンドで、enp0s3をアクティブにします。 # nmcli con up enp0s3 下記のコマンドでIPアドレスを確認すると、筆者の自宅のネットワークはDHCPのため、DHCPでIPアドレスが割り当てられていました。 #ip addr 筆者の自宅のネットワークアドレスは、192.168.11.0/24でした。 PCやスマホと被らない適当なアドレスとして、CentOSに192.168.11.77を割り当てました。 # nmcli con mod enp0s3 ipv4.addresses 192.168.11.77/24 ネットワークインターフェースを再起動します。 # nmcli con down enp0s3 # nmcli con up enp0s3 Mac側のターミナルで、疎通確認ができました。 $ pi...