Slide 1

Slide 1 text

PowerShellのパワー 2018.12.15 CLR/H #108 ~力こそパワー~ Takuya Shibata

Slide 2

Slide 2 text

自己紹介 しばた (a.k.a. 素敵なおひげ) • Blog : https://blog.shibata.tech/ • Twitter : @stknohg CLR/H と きたあず の裏方をやってます 今月から 所属 Microsoft MVP for Cloud and Datacenter Management (2016.07 - ) 2

Slide 3

Slide 3 text

3 タイトルはパワーですが セッションはゆるくいきます

Slide 4

Slide 4 text

アジェンダ 1.PowerShellとは? 2.PowerShellのパワー i. 通常編 ii. 代償編 iii. 暗黒編 3.質問タイム 4

Slide 5

Slide 5 text

PowerShellとは? PowerShellの基本的なところをサラッと 5

Slide 6

Slide 6 text

とりあえずの 理解

Slide 7

Slide 7 text

PowerApps とは関係ない https://powerapps.microsoft.com/ja-jp/

Slide 8

Slide 8 text

Power BI とも関係ない https://powerbi.microsoft.com/ja-jp/

Slide 9

Slide 9 text

もちろん PowerPointでもない

Slide 10

Slide 10 text

PowerShellとは 10 https://docs.microsoft.com/ja-jp/powershell/scripting/powershell-scripting

Slide 11

Slide 11 text

PowerShellの歴史 11 2006 2006年11月、PowerShell 1.0リリース ・・・ ・・・中略・・・ 2016 2016年8月、GitHubにオープンソースとして公開される • 公開時の最新リリースは PowerShell 6.0 Alpha 9 2018 2018年1月、PowerShell Core 6.0リリース • WindowsだけではなくLinuxやmacOSで動作するクロスプラットフォームなアプリケーションに 2018 2018年9月、PowerShell Core 6.1リリース • 2018年12月現在、最新バージョンは 6.1.1

Slide 12

Slide 12 text

PowerShellの歴史 12 PowerShell 1.0 PowerShell 6.0 Desktop Edition Core Edition PowerShell 5.1 Editionなし Windows Linux Mac PowerShell 6.1 Core Edition Core Edition Core Edition Core Edition Core Edition Core Edition

Slide 13

Slide 13 text

2つのPowerShell 13 Windows PowerShell (powershell.exe) ✓PowerShell 1.0 ~5.1 ✓Desktop Edition ✓Windows専用 ✓.NET Framework PowerShell Core (pwsh.exe / pwsh) ✓PowerShell 6.0 ~ 6.1 ✓Core Edition ✓Windows, Linux, macOS ✓.NET Core ※1 厳密にはNano Server向けのPowerShell 5.1もPowerShell Coreに含まれるのですが、ここではわかりやすさのために除外しています ※1

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

Windows PowerShellを利用可能なOS バージョンを問わなければほぼすべてのWindowsに標準搭載 • PowerShell 2.0は既に非推奨 OS 2.0 3.0 4.0 5.0 5.1 Window 7 SP1 Windows Server 2008 R2 SP1 インストール 済み 〇 (更新可) 〇 (更新可) 〇 (更新可) 〇 (更新可) Windows 8 Windows Server 2012 非推奨 インストール 済み 〇 (更新可) 〇 (更新可) 〇 (更新可) Windows 8.1 Windows Server 2012 R2 非推奨 - インストール 済み 〇 (更新可) 〇 (更新可) Windows 10 (初期リリース~Ver. 1511) 非推奨 - - インストール 済み 〇 (更新可) Windows 10 (Ver.1607~) Windows Server 2016 Windows Server 2019 非推奨 - - - インストール 済み 15

Slide 16

Slide 16 text

PowerShell Core 6.1.1を利用可能なOS • Windows 7/8.1/10 • Windows Server 2008R2/2012/2012R2/2016/2019 • Windows Server Semi-Annual Channel (SAC) • macOS 10.12+ • Ubuntu 14.04/16.04/18.04 • Debian 8.7+/9 • CentOS 7 • Red Hat Enterprise Linux (RHEL) 7 • Fedora 27/28 • openSUSE 42.3 16 以下はコミュニティサポートのみ • Ubuntu 18.10 • Arch Linux • Raspbian (ARM32) • Kali Linux • Alpine (2018.12.15時点)

Slide 17

Slide 17 text

PowerShellとは 1.シェル 2.スクリプト言語 3.Windows Management Framework の一部(Windows PowerShellのみ) 17

Slide 18

Slide 18 text

PowerShellの目的 あらゆるインフラの 管理 と 自動化 18

Slide 19

Slide 19 text

管理と自動化 本セッションは”自動化”ツールとしてのPowerShellをメインにお話します

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

中身は一切知りませんが、なんか出るらしいです(洋書) https://www.amazon.co.jp/dp/B07D23FRC8/

Slide 22

Slide 22 text

PowerShellのパワー ~ 通常編 ~ PowerShellの使いどころをつらつらと 22

Slide 23

Slide 23 text

PowerShellの大事な前提(1) • .NET Frameworkまたは.NET Core製 • .NETのオブジェクトを扱うシェル • すべてが”オブジェクト” 23

Slide 24

Slide 24 text

まずは基本から 24

Slide 25

Slide 25 text

PowerShellの基本 25 # 現在時刻を取得 $now = Get-Date Write-Output $now # $now 変数は System.Datetime 型 Write-Output ($now.GetType().FullName) # Datetime型のプロパティやメソッドを使って # 翌日の日付を計算 $tomorrow = $now.Date.AddDays(1) Write-Output $tomorrow 簡単なお題で最低限必要なことを知る

Slide 26

Slide 26 text

PowerShellの基本 1. 変数定義は $変数名 2. 変数は.NET Frameworkの型を持つ • 型の持つプロパティやメソッドを使うことができる 3. PowerShell独自のコマンドレット • Command + Let (小さい) からの造語、Cmdletとも • 内部コマンド • コマンドレットは 動詞-名詞 の命名規則を持つ 26

Slide 27

Slide 27 text

PowerShellの基本 他にもスクリプト言語として様々な要素がある • 配列、ハッシュテーブル • フロー制御 • If文 • for文、foreach文、while文、do文、switch文 • trap文、try-catch-finally • 関数、高度な関数、フィルター • クラス、列挙型 • リダイレクト • パイプライン • etc.. 27 詳細は過去の登壇資料を見てください :) https://www.slideshare.net/stknohg/powershell-77893763

Slide 28

Slide 28 text

PowerShellの基本 最低限知っておくと良いコマンドレット 1. Write-Output • 所謂echo。そのままechoと書いても良い 2. Get-Member • オブジェクトの型、プロパティやメソッドを知る 3. Get-Command • 必要なコマンドレットや関数を調べる 28

Slide 29

Slide 29 text

便利なコマンドレット 29

Slide 30

Slide 30 text

便利なコマンドレット コマンドレットを組み合わせて様々な処理を自動化 30 # # OSの起動と停止のイベントログを抽出してメール送信 # 勤怠の管理なんかに使えるかもしれませんね(: # # イベントログを抽出して $mailMessage 変数に設定 Get-WinEvent -LogName System -FilterXPath "*[System[Provider[@Name='Microsoft-Windows-Kernel-General'] and (EventID=12 or EventID=13)]]" | Select-Object TimeCreated, Id, Message | Format-Table -Autosize | Out-String | Set-Variable -Name mailMessage # outlook.jp からメールを送信 $params = @{ To = '宛先メールアドレス’; From = '<あなたのアカウント>@outlook.jp’; Subject = 'PCの起動・停止ログ’; Body = $mailMessage; Encoding = 'utf8’ SmtpServer = 'smtp-mail.outlook.com’; Port = 587; UseSsl = $true Credential = New-Object PSCredential -ArgumentList ('<あなたのアカウント>@outlook.jp', (ConvertTo-SecureString '<あなたのパスワード>' - AsPlainText -Force)); } Send-MailMessage @params

Slide 31

Slide 31 text

便利なコマンドレット 結果 31

Slide 32

Slide 32 text

PowerShellと.NET Framework 32

Slide 33

Slide 33 text

Add-Type .NET Frameworkのアセンブリ(.dllや.exe)の機能を 取り込むことができる • PowerShell 2.0から • コマンドレットで提供されない.NET Framework / .NET Coreの機能を直接使用できる • 若干開発者向け 33 # Add-Type で外部のアセンブリを取り込むことができる Add-Type -Path '<使用したいアセンブリ名>.dll' # GAC等、アセンブリ名だけで解決できる場合は -AssemblyName パラメーターでも可 Add-Type -AssemblyName 'System.Windows.Forms'

Slide 34

Slide 34 text

PowerShellでSelenium WebDriver(Chrome) 34 # # PowerShellでSelenium WebDriver(Chrome) # * https://blog.shibata.tech/entry/2018/06/13/233932 # # Add-Type Add-Type -Path .¥WebDriver.dll $url = 'https://googlesamples.github.io/web-fundamentals/fundamentals/security/prevent-mixed-content/active-mixed-content.html' #$url = 'https://blog.shibata.tech/' # 警告ログなしの場合 try { # 開始 $options = [OpenQA.Selenium.Chrome.ChromeOptions]::new() # ヘッドレス、log-level=3(LOG_FATAL) $options.AddArguments("headless", "disable-gpu", "log-level=3") $driver = [OpenQA.Selenium.Chrome.ChromeDriver]::new($options) # ブラウザログチェック Write-Host ("{0} をチェックします..." -f $url) -ForegroundColor Green $driver.Url = $url $logs = $driver.Manage().Logs.GetLog('browser’) $mixedContentLogs = $logs | Where-Object { $_.Message -like "*Mixed Content:*"} if (@($mixedContentLogs).Count -eq 0) { Write-Host 'Mixed Contentではありませんでした。' -ForegroundColor Green } else { Write-Warning ('Mixed Contentログが{0}件ありました。' -f @($mixedContentLogs).Count) $mixedContentLogs | Format-List } } finally { # 終了 $driver.Quit() }

Slide 35

Slide 35 text

Add-Type C#やVB.NETのソースコードを取り入れることも可能 • PowerShell CoreではC#のみ(VB.NETのサポートは廃止) • P/Invoke • 完全に開発者向け 35 # 直接C#などのソースコードを取り込み可能 Add-Type -TypeDefinition 'C#等のソースコードによるクラス定義' # -MemberDefinition パラメーターなんてのもある Add-Type -MemberDefinition 'C#等のソースコードによるStaticな関数定義' ` -Namespace 'ルート名前空間' -Name 'クラス名'

Slide 36

Slide 36 text

PowerShellでC# 簡単なクラスを例に 36 # # C#で書いたクラスをAdd-Typeする # $Source = @" public class BasicTest { public static int Add(int a, int b) { return (a + b); } public int Multiply(int a, int b) { return (a * b); } } "@ Add-Type -TypeDefinition $Source # BasicTestクラスの静的メソッドを使う [BasicTest]::Add(4, 3) # もちろんインスタンスを生成することも可能 $BasicTestObject = New-Object BasicTest $BasicTestObject.Multiply(5, 2)

Slide 37

Slide 37 text

PowerShellのデータ処理 37

Slide 38

Slide 38 text

様々なデータフォーマットを扱う組み込みコマンドレット 1. CSV • Export-Csv / Import-Csv • ConvertFrom-Csv / ConvertTo-Csv 2. XML • ConvertTo-Xml / Select-Xml • Invoke-WebRequest 3. JSON • ConvertFrom-Json / ConvertTo-Json • Invoke-RestMethod 4. Markdown (Coreのみ) • ConvertFrom-Markdown / Show-Markdown 38 PowerShellのデータ処理

Slide 39

Slide 39 text

PowerShellでJSON JSON(Web API) を扱う簡単な例 39 # Livedoorお天気Webサービスから札幌の天気予報を取得 Invoke-RestMethod -Uri 'http://weather.livedoor.com/forecast/webservice/json/v1?city=016010' | ForEach-Object { # 概要の出力 Write-Host '天気情報の概要' -ForegroundColor Green [PSCustomObject]@{ PublicTime = $_.publicTime; Area = $_.location.area; Prefecture = $_.location.prefecture; City = $_.location.city; Description = $_.description.text; } | Format-List # 天気予報の出力 Write-Host '天気予報' -ForegroundColor Green $_.forecasts | ForEach-Object { [PSCustomObject]@{ Date = [Datetime]$_.date DateLabel = $_.datelabel Telop = $_.telop MinTemperature = $_.temperature.min.celsius MaxTemperature = $_.temperature.max.celsius } } | Format-Table -AutoSize }

Slide 40

Slide 40 text

PowerShellでJSON 40

Slide 41

Slide 41 text

PowerShellとCOM 41

Slide 42

Slide 42 text

Component Object Model (COM) 細かい話は抜きにして、Windowsに従来からある様々 な機能を実行するためのコンポーネント • かつてはVBScriptでよく使われていた • PowerShellでもCOMを簡易に使うことができる • PowerShell Coreでも使えるが、当然Windows専用 42 https://msdn.microsoft.com/ja-jp/library/cc351706.aspx

Slide 43

Slide 43 text

Component Object Model (COM) よく使われるCOMオブジェクト • Microsoft Office Object: Office操作 • InternetExplorer Object : IE操作 • Shell Object : Explorer周りの機能 • WUA Objects : Windows Update New-ObjectコマンドレットでCOMオブジェクトを生成 43 # New-Object –ComeObject でCOMを扱う $excel = New-Object -ComObject 'Excel.Application'

Slide 44

Slide 44 text

PowerShellでExcel COMを使った よくある実装例 44 $excel = New-Object -ComObject 'Excel.Application' try { # シート作成 $workbook = $excel.Workbooks.Add() $sheet = $workbook.ActiveSheet # シート名の設定 $sheet.Name = '容量’ # セルに書き込み $sheet.Cells.Item(1, 1) = 'ドライブ’ $sheet.Cells.Item(1, 2) = '使用量(GB)’ $sheet.Cells.Item(1, 3) = '容量(GB)’ $i = 2 Get-PSDrive -PSProvider FileSystem | ForEach-Object { $sheet.Cells.Item($i, 1) = $_.Name $sheet.Cells.Item($i, 2) = [int]($_.Used / 1024 / 1024 / 1024) $sheet.Cells.Item($i, 3) = [int](($_.Used + $_.Free) / 1024 / 1024 / 1024) $i++ } # 名前を付けて上書き保存 $excel.DisplayAlerts = $false $workbook.SaveAs('C:¥Temp¥sample.xlsx’) $excel.Quit() } finally { # COMオブジェクトの解放は非常にめんどうくさい... [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet) [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) [GC]::Collect() }

Slide 45

Slide 45 text

より良いExcel操作 COMよりモジュール(EPPlusベース)を使う 45 # # ImportExcelモジュールを使ったパターン # このモジュールならWindows以外でも動作する # Install-Module ImportExcel -scope CurrentUser Get-PSDrive -PSProvider FileSystem | ForEach-Object { [PSCustomObject]@{ 'ドライブ' = $_.Name; '使用量(GB)' = [int]($_.Used / 1024 / 1024 / 1024); '容量(GB)' = [int](($_.Used + $_.Free) / 1024 / 1024 / 1024); } } | Export-Excel -Path C:¥Temp¥sample2.xlsx -WorksheetName '容量'

Slide 46

Slide 46 text

Windows以外でも動作 46

Slide 47

Slide 47 text

サイレントインストール 47

Slide 48

Slide 48 text

Microsoft Windows Installer (MSI) 大抵のWindowsアプリケーションはMSI形式で提供され、 サイレントインストールが可能 msiexec.exe • msiファイルを実行するプログラム • 主なオプション • /i : インストールするMSIファイルを指定 • /quiet : Quiet モード – 画面表示、ユーザー操作一切なし • /passive :無人モード - 進行状況ダイアログのみ表示 • etc… 48

Slide 49

Slide 49 text

PowerShell Coreをサイレントインストール 49 # MSIファイルをダウンロード $msiSource = 'https://github.com/PowerShell/PowerShell/releases/download/v6.1.1/PowerShell-6.1.1-win-x64.msi' $msiOutPath = 'C:¥Temp¥PowerShell-6.1.1-win-x64.msi' Invoke-WebRequest -Uri $msiSource -OutFile $msiOutPath # ダウンロードしたMSIファイルを実行し、サイレントインストール $params = @{ FilePath = 'msiexec.exe’; ArgumentList = @('/i', $msiOutPath, '/passive', '/le', 'C:¥Temp¥PowerShell-6.1.1-win-x64-install.log’); Wait = $true; PassThru = $true; } $proc = Start-Process @params switch ($proc.ExitCode) { 0 { # インストール成功 break } 3010 { # インストール成功 : 要再起動 break } 1602 { # インストールが途中でキャンセルされた Write-Warning "Installation canceled." break } Default { # その他のエラー Write-Error ("Failed to install.(Exit code={0})" -f $_) break } }

Slide 50

Slide 50 text

UI操作の自動化 50

Slide 51

Slide 51 text

残念ながら開発停止 • Windowsのみ • 情報は少ない • 簡単ではない • 機能は強力 51 UI Automation PowerShell Extensions https://archive.codeplex.com/?p=uiautomation

Slide 52

Slide 52 text

PowerShellのパワー ~ 代償編 ~ PowerShellのハマりどころについて 52

Slide 53

Slide 53 text

PowerShellの大事な前提(2) • PowerShellはコマンドプロンプト ではない • PowerShellはBashなどの*shなシェル ではない 53

Slide 54

Slide 54 text

PowerShellが苦手とするもの 54

Slide 55

Slide 55 text

テキスト処理 PowerShellは当初Windowsの管理のために生まれ、 .NETのオブジェクトを扱うものであるため テキスト処理全般の機能は充実していない Bashなどの基本テキストを扱うシェルとは根本的 に前提が異なる 55

Slide 56

Slide 56 text

テキスト処理 56 コマンド 概ね代替可能な PowerShell コマンドレット 特記事項 grep Where-Object オブジェクトの検索 Select-String オブジェクトやファイル中の 文字列の検索 awk ForEach-Object sed ForEach-Object + 正規表現 コマンドレット単体では代替不可 diff - Compare-Objectはオブジェクト の比較なので代替不可 PowerShellで概ね代替可能なコマンドは以下 ※正直高度な操作はできないと考えた方が良い WindowsであればWSLやフリーソフトの使用を検討すべき

Slide 57

Slide 57 text

大量データ処理 PowerShellで大量データを扱うときは注意が必要 たとえば以下の様な記述をしてしまうとあっという間 に大量のメモリを消費してしまう 57 # やってはいけない処理 # 124,249件から227件抽出するのにメモリを 約220MB 消費する $contents = Get-Content -LiteralPath 'KEN_ALL.CSV' $rows = $contents | Where-Object { $_ -like '*新発田市*'} ※1 Surface Pro 4 ,Windows 10環境での計測 ※1

Slide 58

Slide 58 text

大量データ処理 PowerShellで大量データを扱うときはできるだけ 変数にデータをためない様にする 58 # 変数に大量のデータをためない処理 # 124,249件から227件抽出してもメモリの消費はほとんどない $rows = Get-Content -LiteralPath 'KEN_ALL.CSV' ` | Where-Object { $_ -like '*新発田市*'} ※それでも限度はあるのでどうしてもダメな場合は PowerShellを諦めてC#などを使用する

Slide 59

Slide 59 text

PowerShellのハマりどころ 59

Slide 60

Slide 60 text

文字コード PowerShellは当初.NET Framework製のWindows用 ソフトウェアとして開発されたため、 使用する文字コードは.NET Framework(UTF-16) およびWindows(ANSIコードページ)の影響を大きく 受けている PowerShell Coreの登場によりクロスプラットフォーム なソフトウェアとなったためUTF-8前提となる箇所が 増えている 60

Slide 61

Slide 61 text

各種文字コード一覧 61 コマンド プロンプト Windows PowerShell PowerShell Core Bash シェル内部の 文字コード 多分UCS-2 UTF-16 UTF-16 環境依存 (大抵UTF-8) コンソール出力の 文字コード ロケール依存 (日本だとShift-JIS) ロケール依存 (日本だとShift-JIS) ロケール/環境依存 (Shift-JIS / UTF-8) 環境依存 (大抵UTF-8) $OutputEncoding - ASCII UTF-8 - リダイレクトの 文字コード ロケール依存 (日本だとShift-JIS) UTF-16 UTF-8 環境依存 (大抵UTF-8) -Encoding の既定値 - UTF-16 UTF-8 - ※環境の切り分けが雑なのと一部内容に自信のない部分があります… 本表の内容については正確なものではなく、おおまかな雰囲気を捉えるためのものとお考えください。

Slide 62

Slide 62 text

文字コードで気を付けるところ 1. リダイレクト(> , >>) • Windows PowerShellのリダイレクトは内部的に `Out-File -Encoding unicode`を呼び出している • PowerShell 5.1までは文字コードの変更不可 PowerShell 5.1では以下の様にして変更可能 • PowerShell Core 6.0からは `Out-File -Encoding Utf8NoBom`の呼び出しに変更 62 # パラメーターのデフォルト値を指定することで変更 $PSDefaultParameterValues["Out-File:Encoding"] = 'utf8'

Slide 63

Slide 63 text

文字コードで気を付けるところ 63 PowerShellの基本はパイプライン Out-File –Encoding でエンコーディングを明示する # PowerShellはパイプラインが基本 # リダイレクトの代わりに Out-File でエンコーディングを明示する Write-Output "力こそパワー" | Out-File -FilePath '.¥output.txt' -Encoding utf8 # PowerShell CoreならEncodingオブジェクトをそのまま指定できる $encoding = [System.Text.Encoding]::GetEncoding(51932) # EUC Write-Output "力こそパワー" | Out-File -FilePath '.¥output.txt' -Encoding $encoding

Slide 64

Slide 64 text

文字コードで気を付けるところ 2. UnicodeのBOM • Windows PowerShellでのUnicodeは基本BOM付き • .NET FrameworkのEncodingクラスがそうであるため • PowerShell Coreでも基本は変わらないが、ファイル出力 などの処理ではBOM無しUTF-8が使われる様に改善 64 # Windows PowerShellにおいてBOM無しUTF-8でファイル保存する方法 # 詳細は https://blog.shibata.tech/entry/2016/10/02/154329 @' 2018.12.15 CLR/H #108 ~力こそパワー~ '@ | ForEach-Object { [Text.Encoding]::UTF8.GetBytes($_) } ` | Set-Content -Path ".¥Utf8NoBOM.txt" -Encoding Byte

Slide 65

Slide 65 text

-Pathパラメーター コマンドレットのパラメーターにはワイルドカード 文字を使うことができる (実装は任意だがMicrosoft製のものはほぼ100%利用可) • * : 0文字以上の任意の文字列 • ? : 1文字の任意の文字 • [] : []内で指定したパターンにマッチする文字列 65 ファイルを取り扱うコマンドレットの -Pathパラメーター ではワイルドカード文字が有効

Slide 66

Slide 66 text

-Pathパラメーター ワイルドカードの例 66 # dir -Path [1-2]?? と同様 dir [1-2]??

Slide 67

Slide 67 text

-Pathパラメーター [] はファイルや ディレクトリ名に使える 67 # ファイル、フォルダ名に[]があるとダメ Get-Item '[001]_Rock¥' # ワイルドカード文字をエスケープする必要がある Get-Item '`[001`]_Rock¥'

Slide 68

Slide 68 text

-Pathパラメーター -Path パラメーターではなく –LiteralPath を使う 68 # -LiteralPath パラメーターは # ワイルドカード検索しない Get-Item -LiteralPath '[001]_Rock¥'

Slide 69

Slide 69 text

PowerShellのパワー ~ 暗黒編 ~ PowerShellのセキュリティまわりについて 69

Slide 70

Slide 70 text

PowerShellの大事な前提(3) • PowerShellはOS(特にWindows)の 管理ツールである • 権限さえあればWindowsの様々な 機能にアクセスできる 70

Slide 71

Slide 71 text

マルウェアとしての PowerShell 71

Slide 72

Slide 72 text

マルウェアに使われるPowerShell PowerShellそのものが脆弱性を持つことはほぼ無いが、 別の脆弱性を起点に悪意あるPowerShellスクリプトを 実行させる攻撃は多い • Windows OSの管理機能が豊富 • スクリプト言語として高機能 • 通常のOS管理における動作との区別のしにくさ • ファイルレスマルウェア 72

Slide 73

Slide 73 text

PowerShellのセキュリティ 73

Slide 74

Slide 74 text

実行ポリシー みんな毛嫌いしているアレ • スクリプトを実行可能な条件を表す”ポリシー” • ポリシーの適用範囲を表す”スコープ” の2つの概念がある 74

Slide 75

Slide 75 text

ポリシー一覧 ポリシー 内容 Restricted • コマンド実行可能 • スクリプト実行は一切不可 AllSigned • コマンド実行可能 • 署名されたスクリプトのみ実行可能 RemoteSigned • コマンド実行可能 • インターネットからダウンロードした スクリプトを実行するには署名が必要 Unrestricted • コマンド実行可能 • スクリプト実行可能(警告が出る場合あり) Bypass • コマンド実行可能 • スクリプト実行可能(警告は一切出ない) Undefined • ポリシー未設定 スコープ一覧 スコープ 内容 Process • 現在のプロセス CurrentUser • 現在のユーザー LocalMachine • コンピューターの 全ユーザー 75 実行ポリシー

Slide 76

Slide 76 text

Windows PowerShell OS ポリシー (設定スコープ) Windows 7 Restricted (All undefined) Windows 8, 8.1 Restricted (All undefined) Windows 10 Restricted (All undefined) Windows Server 2008 R2 Restricted (All undefined) Windows Server 2012 Restricted (All undefined) Windows Server 2012 R2 RemoteSigned (LocalMachine) Windows Server 2016 RemoteSigned (LocalMachine) Windows Server 2019 RemoteSigned (LocalMachine) PoweShell Core OS ポリシー (設定スコープ) Windows RemoteSigned (LocalMachine) Linux Unrestricted (All scopes) macOS Unrestricted (All scopes) 76 既定のポリシー

Slide 77

Slide 77 text

現在のポリシーを確認 `Get-ExecutionPolicy -List`と-Listを付けると スコープごとのポリシーを確認できる 77

Slide 78

Slide 78 text

ポリシーを設定 「スコープを指定する」 とりあえずこれだけ覚えておけば良い気がします 78 # CurrentUserスコープで実行ポリシーを設定 (管理者権限不要) Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Slide 79

Slide 79 text

実行ポリシーの大事な点 1. 実行ポリシーを設定するのに管理者権限は必須では ない • LocalMachineスコープの設定時のみ管理者権限が必要 2. 実行ポリシーがあれば悪意あるスクリプトを完全に 防げるわけではない • 実行ポリシーを迂回する方法は多数ある • 悪意を持った攻撃者に対しては割と無力 • ユーザーが誤って意図しないスクリプトを実行しない 様にするためのもの 79

Slide 80

Slide 80 text

PowerShell Team曰く、 実行ポリシーは シートベルト (事故を防ぐためのものではなく、事故が起きたとき(意図しないスクリプトが実行されたとき)に命を守るためのもの、の意) https://blogs.msdn.microsoft.com/powershell/2008/09/30/powershells-security-guiding-principles/

Slide 81

Slide 81 text

Antimalware Scan Interface (AMSI) Windows 10から導入された、マシンにインストール されているアンチウィルスソフトの機能を利用する ためのAPI Windows 10 + PowerShell 5.0以降の環境であれば PowerShell内部でこのAPIを使い悪意あるスクリプト を検出できる • Windows 10 + PowerShell Core 6.0も対象 • LinuxやmacOSは対象外 82 ただし現時点では抜け道が結構ある…

Slide 82

Slide 82 text

Antimalware Scan Interface (AMSI) 83

Slide 83

Slide 83 text

ダウングレードアタック Windows 10 + PowerShell 5.0 – 5.1だとAMSIが働く ため、PowerShell 2.0を起動して悪意あるスクリプト を実行させようとする攻撃 84 # -Version 2.0 でPowerShell 2.0のランタイムで実行 powershell.exe -Version 2.0 -Command {"悪意あるスクリプト"} PowerShell 2.0は既に非推奨なので 使わない・有効にしない

Slide 84

Slide 84 text

質問タイム お気軽にどうぞ 85

Slide 85

Slide 85 text

Thank You!