Cisco Nexus 9Kに公開鍵認証を使ってログインする方法

業務でCisco Nexusに公開鍵認証を使ってSSHログインする事があったので
その時の手順を残します。

ログイン元サーバにて秘密鍵と公開鍵の生成を行う

今回は自分のmac bookからログインするのでターミナルを起動して
下記コマンドにて秘密鍵と公開鍵の生成を行った。

MacBook-pro:~ localhost$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/localhost/.ssh/id_rsa): 
Created directory '/Users/localhost/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/localhost/.ssh/id_rsa.
Your public key has been saved in /Users/localhost/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:tYBWM80VZu2yXdGnodiFH/vZJkH64mmd16D5MNKLvKY localhost@MacBook-pro.local
The key's randomart image is:
+---[RSA 2048]----+
|        +o .=+  .|
|       o ooo. *.o|
|      o . .o B =o|
|     .   o..= * .|
|        S .  = +o|
|           .o =.+|
|          ..+* =.|
|         ..o*+o o|
|        Eo+o.... |
+----[SHA256]-----+
MacBook-pro:~ localhost$ 

すると下記ディレクトリに二つのファイルが出来ている。

MacBook-pro:~ localhost$ ls /Users/localhost/.ssh/
id_rsa		id_rsa.pub

id_rsa秘密鍵でid_rsa.pubが公開鍵だ。
生成された公開鍵をcatコマンドで確認する。
※2048obit長で生成しているので鍵の長さを省略している。

MacBook-pro:~ localhost$ cat /Users/localhost/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAAD (省略) b4whh91xnL kyamisama@kyamisamanoMacBook-puro.local

Nexusで公開鍵の登録を行う

最後にNexus側で公開鍵の登録を行って完了だ。
ここで登録するユーザを間違えないように注意する。
実際にNexusのadminユーザに公開鍵を登録してみる。

Nexus(config)# username admin sshkey ssh-rsa AAAAB3NzaC1yc2EAAAAD (省略) b4whh91xnL kyamisama@kyamisamanoMacBook-puro.local
Nexus(config)#

以上で作業完了である。
下記SSHコマンドの通りオプション-iを付け、その後ろに秘密鍵を指定すれば
問題なくログインできるはずだ。

ssh -i /Users/localhost/.ssh/id_rsa admin@192.168.2.100

tornadoでHTTPSのウェブページを作ってみた。

かなり久しぶりの更新です。。
サボり気味だったので一応生存確認と言う事で今回もtornadoの記事です。
せっかくtornadoを使ってWebページを公開するところまでやったので
最低限のHTTPSの実装もやってみました。

以下その時の覚書です。

事前準備

オレオレ証明書の作成

HTTPSの実装で必要不可欠である証明書の類のものを準備します。
準備はとっても簡単、下記コマンドを打つだけでOK。

$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

tornadoスクリプトHTTPS仕様にする

tornadoの公式に落ちているコードをHTTPS仕様にしてみました。
※一部抜粋

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(make_app, ssl_options={
        <b>"certfile":"server.crt"</b>,
        <b>"keyfile":"server.key"</b>,
    })
    http_server.listen(<b>8443</b>)

import tornado.httpserver
import tornado.ioloop
import tornado.web
全体のコード
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("../static/test.html")

make_app=tornado.web.Application([
        (r"/", MainHandler),])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(make_app, ssl_options={
        "certfile":"server.crt",
        "keyfile":"server.key",
    })

    http_server.listen(8443)
tornado.ioloop.IOLoop.current().start()

以上でtornadoでのHTTPS実装でした。

SSHの公開鍵認証の設定手順

個人的にLinuxサーバを利用する機会があり
その時に公開鍵の設定を行ったので手順を残す。

各種環境

クライアントPC:Mac book air
サーバ:Conoha VPS Ubuntu 14.04.5

クライアント側で鍵の生成

クライアントPCで秘密鍵と公開鍵の生成を行います。
鍵生成コマンドを2種類ありますが今回はRSAで生成を行います。

$ ssh-keygen -t rsa

実行すると対話式で鍵の保存場所やパスフレーズを聞かれますので
任意の設定を行う。

問題なく鍵が生成されたか確認を行う。

$ cd ~/.ssh/
$ ls id*
id_rsa		id_rsa.pub

上記のように「id_rsa」と「id_rsa.pub」が生成されていればOK
ちなみに「id_rsa」が秘密鍵で「id_rsa.pub」が公開鍵である。
くれぐれも秘密鍵が外部に漏れないように注意してほしい。

サーバに公開鍵を登録する。

先ほど生成した公開鍵をサーバに登録するので
scpコマンドでサーバに公開鍵を転送させる。

scp -r ~/.ssh/id_rsa.pub root@<サーバのIPアドレス>:/root/

とりあえずサーバの/root/直下に転送。
そこからサーバの「authorized_keys」に公開鍵を登録する。

# ls /root/
id_rsa.pub
# cat id_rsa.pub >> ~/.ssh/authorized_keys
# chmod 600 ~/.ssh/authorized_keys
# logout
$ ssh -i ~/.ssh/id_rsa root@<サーバのIPアドレス>

lsコマンドで/root/に公開鍵が転送されているのを確認し、
authorized_keysに登録する。
その後、パーミッションの変更を行い一度サーバからログアウトする
再度sshコマンドでログインを試みる。

Python3 Jupyter Notebook導入メモ

前回TensorFlowのセットアップ記事を書いたので
今回はTensorFlowで試行錯誤する際に便利な
Jupyter Notebookを導入してみようと思います。

下記コマンドでインストール行う。

$ pip install jupyter

そして起動。

$ jupyter notebook

うまく動作すればブラウザが起動して、Jupyter Notebookが
表示されるはずです。
f:id:kyamisama:20180923114022p:plain

今後使い方についても書いていこうと思います。

TensorFlowのインストールから簡単な計算までやってみる。

先日書店にて入門書向けの深層学習の導入本を購入したので
TensorFlowの導入メモを残してみる。

深層学習とはなにか

今更このような事を説明するのは無粋だと思う。
何しろこの手の情報はネットや書籍がごまんと転がっているからだ。
それでも私のアウトプットとして役だって貰うため説明させていただく。

深層学習 ディープラーニングについて

深層学習とは、多層構造のニューラルネットワークを用いた機械学習のことである。
今でこそ人気の分野であると世間に知れ渡っているが、その火付け役となったのは
2012年に開催された画像認識コンテストだと言われている。
この大会は大規模な画像認識・分析をソフトウェアで行わせる。
具体的にはImageNetで公開されている飛行機やピアノなどの
様々なものが写っている写真データを学習させ、
写真に何が写っているか認識させ、その精度を競うものだ。
そして、この年にカナダ・トロント大学チームが深層学習を利用して
2位のチームを大きく引き離して優勝したのだ。

深層学習の特徴(手法)について

深層学習の手法は、それ以外のものを比べて大きく異なる点がる。
それは特徴量の抽出だ。
従来の手法だと人間が特徴量を指定する必要があったが、
深層学習では学習データから気概が自動的に特徴量を抽出する。

TensorFlowについて

TensorFlowはGoogleオープンソースで公開している機械学習ライブライアである。
深層学習を始め、いろいろな機械学習に利用できる。
機械学習ではこのライブライの人気がとても高いので資料も充実している。
機械学習の導入としては打って付けだろう。

TensorFlowのインストールを行う

ここまで話が長くなったが早速TensorFlowをインストールしていく。
ちなみにTensorFlowはWindowsにはインストールが出来ない。
もしWindowsでTensorFlowを利用したいのであればDockerやWMware上で
Linuxを動かし、そこにインストールする事をオススメする。

今回はmacを使ってインストールを行う。
その前にPyenvを使ってAnacondaをインストールしておく。

$ pyenv install anaconda3-4.1.1
$ pyenv global anaconda3-4.1.1
$ pyenv rehash

ここからTensorFlowのインスール

$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0-py3-none-any.whl
$ pip install --upgrade $TF_BINARY_URL

それでは無事にTensorFlowがインストール出来たか確認してみよう。
以下のように「hello」が表示されていれば問題ない。

$ python
>>> import tensorflow as tf
>>> sess=tf.Session()
>>> hello=tf.constant("hello")
>>> sess.run(hello)
b'hello'
>>> 

TensorFlowで簡単な計算をさせてみる

とりあえずサンプルコードを実行してみる。
うまく動作すれば「6234」と値が返ってくるはずだ。

$ cat calc1.py 
# Tensorflowを取り込む
import tensorflow as tf

# 変数a,bに数字を代入
a = tf.constant(1234)
b = tf.constant(5000)

# 計算式を定義
add_op = a + b

# セッションを開始
sess = tf.Session()
res = sess.run(add_op) # 式を評価
print(res)

実行結果

$ python calc1.py 
6234

Tornadoを使ってHTMLページを表示させる

前回の記事の続きでTornadoを使ってHTMLページを表示させたいと思います。
ただ今回は前回と違って、ヒアドキュメントを使ったHTMLの表示ではなく
TornadoからHTMLファイルを呼び出す事で表示させます。

Tornadoファイルの用意

それでは前回記事で使ったTornadoファイルのヒアドキュメント部分を
削除したものを用意します。
このプログラムは実行するとブラウザに”hello world”の文字列を返えします。

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello,world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

HTMLファイルの用意

HTMLファイルはネットで適当に転がっているサンプルを使用します。

<!DOCTYPE html>
 <html>
   <head>
   </head>
    <body>
     <p>hello,world</p>
    </body>
 </html>

Tornadoのstaticpathを使って静的ファイル(HTMLファイル)を指定する

参考URL:https://sites.google.com/site/tornadowebja/documentation/overview
上記URLを参考にしてTornadoファイルを変更していきます。
まず、def make_app():を下記コードのように変更します。

def make_app():
    settings = {
    "static_path": os.path.join(os.path.dirname(__file__), "static"),
}
    return tornado.web.Application([
    (r"/", MainHandler),
], **settings)

これでstaticpathの設定は完了です。

次にlocalhost:8888にアクセスした際にHTMLファイルを見に行く設定を行います。
MainHandler内を下記コードのように変更します。

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("static/E4.html")

これでTornadoファイルを保存して実行してみます。
問題なければ正常にHTMLファイルが表示されます。

Python3でfizz buzz問題やってみた

fizz buzz問題は私が本格的にPythonの勉強をし始めた頃に
一番最初に取り組んだ課題です。
なので今回は備忘録ではなく、ただの日記です。(笑)

Python3でfizz buzz問題をやってみる!

プログラミングの勉強をしていてよく耳にする「FizzBuzz問題」ってのをやってみました。
ここで一言、勘違いしてもらっては困りますので言っておきますが、
FizzBuzz」とは元は長距離ドライブ中や飲み会の時に行われる言葉遊びなのです。
その遊びをプログラムの問題としたのが「FizzBuzz問題」と言うわけですね。

そもそもFizzBuzzって??

wikiによると下記のような遊びのようです。
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。
次のプレイヤーは直前のプレイヤーの次の数字を発言していく。
ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、
5で割り切れる場合は「Buzz」、両者で割り切れる場合
(すなわち15で割り切れる場合)は
Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を
数の代わりに発言しなければならない。
発言を間違えた者や、ためらった者は脱落となる。

実際にFizzBuzz問題に挑戦!!

先ほどご紹介した通り、3で割り切れる場合は「Fizz」、
5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は
Fizz Buzz」と表示されるようにプログラムを組めばいいわけです。

1から100までやると表示が長くなるので20までにしておきます。
下記にプログラムコードと実行結果を紹介します。

for i in range(1,21):
    if i % 15 == 0:
        print("fizzbuzz")
    elif i % 3 == 0:
        print("fizz")
    elif i % 5 == 0:
        print("buzz")
    else: 
        print(i)

で下記が出力結果ですね。

1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz

とまぁこんな感じでしょうか。
もっとスマートにプログラムを書けるよって方は是非ともコメントで
教えて欲しいですね!!

それでは今日はこの辺で!
昨日に引き続きブログ1記事更新完了!!
さて、いつまで続くやら。。