サーバ

RLogin、VS CodeでSSH接続できない!?SSH2のエラー「publickey,gssapi-keyex,gssapi-with-mic」の対処

RLoginやVS CodeでSSH接続できなかったので、その対処法。

経緯

PCを交換しWindows10からWindows11に変更。

RLoginでLinuxサーバーにSSH接続を試すも失敗。

その後、VS CodeのRmote SSHでも失敗。

下記2種類のエラーでログインできなかったので対処法をメモ。

  • gssapi-with-micエラー
  • SSHエラー

gssapi-with-micエラー

gssapi-with-micのエラー内容

RLoginのエラー内容

RLoginでログインしようとした際に、以下のエラーが発生。

SSH2 User Auth Failure "publickey.gssapi-keyex,gssapi-with-mic" Status=1004
Send Disconnect Message...
gssapi-with-mic({サーバーのIP})

VS Codeのエラー内容

VS CodeのRemote SSHを使用し、サーバーにログインしようとした際に以下のエラーが発生。

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

gssapi-with-micエラーの対処法

調べてみるとユーザー名が間違ってたりするとこのエラーになるみたいなんですが、今回は違う理由でした。

ただの秘密鍵の指定ミスw

正しい秘密鍵を使用していなかったのでエラーでした。

秘密鍵(PrivateKey)を忘れていないか、指定ミスがないか確認してみましょう。

SHAエラー

SHAのエラー内容

RLoginで以下のエラーが発生。

SSH2 User Auth Failure "publickey.gssapi-keyex,gssapi-with-mic" Status=1004
Send Disconnect Message...
publickey(rsa-sha2-256), gssapi-with-mic({サーバーのIP})

You may need to change the ssh-rsa key sign algorithm SHA1 to SHA2-256/512

SHAエラーの対処法

公開鍵、秘密鍵がSHA1で作成されていて、それを使用しているためエラー。
セキュリティ的にもSHA2で作成しなおしたほうが良いです。

どうしても、今あるキーでログインしたい場合は、RLoginの設定を一時的に変更してログイン。

変更方法は以下。

  1. サーバーを選択し、「編集」ボタンをクリック
  2. 左メニューから「プロトコル」を選択
  3. 「RSA2認証鍵の署名方式」を「SSH1」に変更し、「OK」ボタンをクリック

これでログインできるようになりました。

それでもログインできない場合は、「known_hosts」に書き込まれた内容を削除してみてください。

・削除方法

  1. 「C:/Users/{user name}/.ssh/known_hosts」を開き、対象のサーバの記述を削除。

SSH1でログインできたからといってそのままにしておかず、早めにSHA2に変更しておきましょう!

その際にサーバー側がOPENSSH7.2以前だとSHA1のみのようなので、OPENSSHのバージョンも確認し必要ならアップデートしておきましょう。

・OPENSSHのバージョン確認コマンド

ssh -V

Windowsのターミナルソフト「RLogin」の導入方法。見やすくて便利なターミナル!

Windows用のターミナルソフト「RLogin」を使用する方法をご紹介!

サーバーにSSH接続して、コマンド実行することができます。
結構見やすくて便利です。

RLoginを導入

導入は簡単です!ダウンロードして実行でOK。

インストール不要で使うことができます。

RLoginをダウンロード

Githubに実行プログラムがあるのでダウンロード。

https://github.com/kmiya-culti/RLogin/releases/

ダウンロードしたZipを解凍

「rlogin_x64.zip」のようなZipファイルがダウンロードされたと思うので、それを解凍。

解凍場所はどこでも大丈夫です。

RLogin.exeを実行

解凍したファイルに「RLogin.exe」があるので、それを実行すればRLoginが立ち上がります。
インストールの実行は不要です。

RLoginのマニュアルはこちら
https://kmiya-culti.github.io/RLogin/

【AWS】lambda&cronでEC2起動・停止(EC2のタグで判定)

awsのlambdaとcron(lamron[ラムロン])を使用して、指定した時間にEC2インスタンスを起動&停止する処理を作成します。
起動と停止をするEC2インスタンスの指定は、EC2のタグで判定します。

準備

以下の設定を行っている前提です。

  • IAMでLambdaにec2関連APIの使用許可を設定
  • EC2インスタンスに起動と停止を判定するタグを設定(後述するスクリプトに記載してあるタグ)

Lambdaに起動&停止Functionを作成

lambdaに起動&停止のFunctionを以下のスクリプトを参考に作成してください。
lambdaFunctionを作成するときは、

  • 各自起動&停止したい時間のcronを設定
  • 今回はスクリプト作成にnode.jsを使用
  • 実行する関数名は「handler」

起動スクリプト

// 起動するec2インスタンスのタグ設定
// この場合、キー名が「lambda:start」、値が「default-first」
var targetInstanceParam = {
    Filters: [
        {
            Name: 'tag-key',
            Values: ['lambda:start']// ec2インスタンスに設定するキー名
        },
        {
            Name: 'tag-value',
            Values: ['default-first']// ec2インスタンスに設定する値
        },
    ]
};

var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-1'; // 各自の環境に合わせてリージョンを設定

function ec2Start(cb){
    var ec2 = new AWS.EC2();
    var targetInstanceIds = [];
    
    // 指定したタグが設定されているec2インスタンスを取得
    ec2.describeInstances(targetInstanceParam, function(err, data) {
        if (err) console.log(err, err.stack);
        else if(data.Reservations.length === 0) {
            console.log("don't find ec2");
        } else {
            // 取得できた場合、そのec2インスタンスのidを取得し起動
            for (var index in data.Reservations) {
                var instance = data.Reservations[index].Instances[0];
                console.log("instanceId = " + instance.InstanceId);
                targetInstanceIds.push(instance.InstanceId);
            }
            var params = {
                InstanceIds: targetInstanceIds
            };
        
            ec2.startInstances(params, function(err, data) {
                if (!!err) {
                    console.log(err, err.stack);
                } else {
                    console.log(data);
                    cb();
                }
            });
        }
    });
}
// 初めに実行する関数
exports.handler = function(event, context) {
    // ログ出力(不要であれば削除)
    console.log('start');
    // ec2インスタンス起動処理
    ec2Start(function() {
        context.done(null, 'Started Instance');
    });
};

停止スクリプト

// 停止するec2インスタンスのタグ設定
// この場合、キー名が「lambda:stop」、値が「default-first」
var targetInstanceParam = {
    Filters: [
        {
            Name: 'tag-key',
            Values: ['lambda:stop']// ec2インスタンスに設定するキー名
        },
        {
            Name: 'tag-value',
            Values: ['default-first']// ec2インスタンスに設定する値
        },
    ]
};

var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-1'; // 各自の環境に合わせてリージョンを設定

function ec2Start(cb){
    var ec2 = new AWS.EC2();
    var targetInstanceIds = [];
    
    // 指定したタグが設定されているec2インスタンスを取得
    ec2.describeInstances(targetInstanceParam, function(err, data) {
        if (err) console.log(err, err.stack);
        else if(data.Reservations.length === 0) {
            console.log("don't find ec2");
        } else {
            // 取得できた場合、そのec2インスタンスのidを取得し停止
            for (var index in data.Reservations) {
                var instance = data.Reservations[index].Instances[0];
                console.log("instanceId = " + instance.InstanceId);
                targetInstanceIds.push(instance.InstanceId);
            }
            var params = {
                InstanceIds: targetInstanceIds
            };
        
            ec2.startInstances(params, function(err, data) {
                if (!!err) {
                    console.log(err, err.stack);
                } else {
                    console.log(data);
                    cb();
                }
            });
        }
    });
}
// 初めに実行する関数
exports.handler = function(event, context) {
    // ログ出力(不要であれば削除)
    console.log('start');
    // ec2インスタンス停止処理
    ec2Start(function() {
        context.done(null, 'Stoped Instance');
    });
};

【AWS】ec2:describe* 関連のAPIで権限エラー

awsのlambdaでec2.describeInstances()を使用しようとした時に、権限エラーで使えず・・・

原因

lambdaにec2:describeInstancesの権限をIAMで付与しなければならないのだが、その権限付与の仕方がダメでした。
Resourceに"*"を指定していたのが原因です。

awsでec2:describe* 関連のAPIを使用するときは、Resourceでの制限はサポートされていません。
マニュアルに書いてありました。。

Note
現在、Amazon EC2 ec2:Describe* API アクションは、リソースレベルのアクセス許可をサポートしていません。そのため、ユーザーがコンソールで表示できる個人のリソースを制御できません。したがって、上記のステートメントの Resource エレメントには、* (ワイルドカード)が必要です。どの Amazon EC2 API アクションでどの ARN を使用できるかについては、Amazon EC2 API アクションでサポートされるリソースレベルのアクセス許可 を参照してください。

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-policies-ec2-console.html