IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> NSQ详细教程3 Auth权限验证测试 -> 正文阅读

[系统运维]NSQ详细教程3 Auth权限验证测试

Auth 认证方式验证

nsqd 可以通过第三方认证服务,来对tcp访问进行认证,这里对该功能进行测试

准备启动认证服务

我这里已经编译好一个,可以直接下载使用 点击下载
也可以自己开发或自行到github下载
将程序上传并赋予执行权限如下:

[root@localhost nsq]# ll
total 9436
drwxr-xr-x. 2 root wheel     154 Aug 16  2021 bin
-rw-r--r--. 1 root root        0 Apr 16 00:31 nsq-1.2.1.linux-amd64.go1.16.6
-rwxr--r--. 1 root root  9655078 May 10  2022 nsq-auth

nsq-auth -h 可以查看 参数信息,这里指定认证秘钥为123456 启动服务如下,服务默认监听1325端口:

[root@localhost nsq]# ./nsq-auth -h
2022/04/17 15:30:44 Usage:
  nsq-auth [OPTIONS]

Application Options:
  -a, --address=  api port default :1325 (default: :1325)
  -i, --identity= identity default zhimiaox-nsq-auth (default: zhimiaox-nsq-auth)
  -u, --auth-url= auth-url (default: http://localhost:1325)
  -t, --ttl=      auth expire duration unit s, default 60 (default: 60)
  -s, --secret=   root secret allow all push and sub topic and channel
  -f, --csv=      csv secret file path

Help Options:
  -h, --help      Show this help message

You have new mail in /var/spool/mail/root
[root@localhost nsq]# ./nsq-auth -s 123456
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.(*api).Ping-fm (3 handlers)
[GIN-debug] GET    /auth                     --> main.(*api).Auth-fm (3 handlers)
[GIN-debug] GET    /refresh                  --> main.(*api).Refresh-fm (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :1325

浏览器访问服务 ping接口 证明服务正常启动
在这里插入图片描述

启动nsq服务

启动nsqdlookup nsqd nsqadm 服务,传入身份验证服务地址,如下:

[root@localhost nsq]# bin/nsqlookupd 
[nsqlookupd] 2022/04/17 16:07:28.483336 INFO: nsqlookupd v1.2.1 (built w/go1.16.6)
[nsqlookupd] 2022/04/17 16:07:28.486129 INFO: TCP: listening on [::]:4160
[nsqlookupd] 2022/04/17 16:07:28.486130 INFO: HTTP: listening on [::]:4161
[nsqlookupd] 2022/04/17 16:08:29.604596 INFO: TCP: new client(192.168.195.10:51812)
[root@localhost nsq]# bin/nsqd -auth-http-address "192.168.195.10:1325" -lookupd-tcp-address "192.168.195.10:4160"
[nsqd] 2022/04/17 16:08:29.601832 INFO: nsqd v1.2.1 (built w/go1.16.6)
[nsqd] 2022/04/17 16:08:29.601880 INFO: ID: 856
[nsqd] 2022/04/17 16:08:29.602684 INFO: TOPIC(t1): created
[nsqd] 2022/04/17 16:08:29.602733 INFO: TOPIC(testtopic): created
[nsqd] 2022/04/17 16:08:29.602740 INFO: NSQ: persisting topic/channel metadata to nsqd.dat
[nsqd] 2022/04/17 16:08:29.602897 INFO: DISKQUEUE(t1): readOne() opened t1.diskqueue.000000.dat
[nsqd] 2022/04/17 16:08:29.604075 INFO: LOOKUP(192.168.195.10:4160): adding peer
[nsqd] 2022/04/17 16:08:29.604089 INFO: LOOKUP connecting to 192.168.195.10:4160
[nsqd] 2022/04/17 16:08:29.604193 INFO: HTTP: listening on [::]:4151
[root@localhost nsq]# bin/nsqadmin -lookupd-http-address "192.168.195.10:4161"
[nsqadmin] 2022/04/17 16:09:22.575867 INFO: nsqadmin v1.2.1 (built w/go1.16.6)
[nsqadmin] 2022/04/17 16:09:22.577727 INFO: HTTP: listening on [::]:4171

编写nsq测试程序

编写测试程序进行消息的发布和消费 main_test.go代码如下

package main

import (
	"fmt"
	"github.com/nsqio/go-nsq"
	"os"
	"os/signal"
	"syscall"
	"testing"
	"time"
)

//AuthHost = "http://192.168.195.10:1325"
//host     = "192.168.195.10:4150"
//Secret   = "123456" //nolint:gosec
const (
	topicName = "t1"
	channel1  = "c1"
	channel2  = "c2"
	address   = "192.168.195.10:4150"
	secret    = "123456"
)

type myMessageHandler struct{}

// HandleMessage implements the Handler interface.
func (h *myMessageHandler) HandleMessage(m *nsq.Message) error {
	fmt.Printf("%s\n", m.Body)
	return nil
}

func TestPush(t *testing.T) {
	config := nsq.NewConfig()
	config.AuthSecret = secret
	producer, err := nsq.NewProducer(address, config)
	if err != nil {
		t.Fatal(err)
	}
	now := time.Now()
	for i := 0; i < 2; i++ {
		messageBody := []byte(fmt.Sprintf("hello %d", i))
		err = producer.Publish(topicName, messageBody)
		if err != nil {
			t.Fatal(err)
		}
		// time.Sleep(3 * time.Second)
	}
	t.Log(time.Now().Sub(now))
	producer.Stop()
}

func TestSub1(t *testing.T) {
	config := nsq.NewConfig()
	config.AuthSecret = secret
	consumer, err := nsq.NewConsumer(topicName, channel1, config)
	if err != nil {
		t.Fatal(err)
	}
	consumer.AddHandler(&myMessageHandler{})
	err = consumer.ConnectToNSQD(address)
	if err != nil {
		t.Fatal(err)
	}
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	<-sigChan
	consumer.Stop()
}

func TestSub2(t *testing.T) {
	config := nsq.NewConfig()
	config.AuthSecret = secret
	consumer, err := nsq.NewConsumer(topicName, channel2, config)
	if err != nil {
		t.Fatal(err)
	}
	consumer.AddHandler(&myMessageHandler{})
	err = consumer.ConnectToNSQD(address)
	if err != nil {
		t.Fatal(err)
	}
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	<-sigChan
	consumer.Stop()
}

//func main() {
//	fmt.Println("hello")
//}

消息发送测试

执行测试命令 发现消息发送成功

PS D:\workspaces\workgotest\gotest> go test -v -run TestPush
=== RUN   TestPush
2022/05/10 18:49:03 INF    1 (192.168.195.10:4150) connecting to nsqd                                                               
2022/05/10 18:49:03 INF    1 (192.168.195.10:4150) Auth accepted. Identity: "zhimiaox-nsq-auth" http://localhost:1325 Permissions: 1
    main_test.go:48: 33.5342ms
2022/05/10 18:49:03 INF    1 (192.168.195.10:4150) stopping
2022/05/10 18:49:03 INF    1 (192.168.195.10:4150) exiting router
--- PASS: TestPush (0.03s)
PASS
ok      gotet   0.065s

同时可以看到 认证服务 有认证日志输出
在这里插入图片描述

nsqadmin中也可以看到我们发送的消息
在这里插入图片描述

修改客户端密码测试

将测试代码中的密码改为1234567

secret    = "1234567"

再次执行上述测试,发现发送失败,提示 链接到nsq权限验证失败。

PS D:\workspaces\workgotest\gotest> go test -v -run TestPush 
=== RUN   TestPush
2022/05/10 18:52:34 INF    1 (192.168.195.10:4150) connecting to nsqd
2022/05/10 18:52:34 ERR    1 (192.168.195.10:4150) Auth Failed Error authenticating E_AUTH_FAILED AUTH failed
2022/05/10 18:52:34 ERR    1 (192.168.195.10:4150) error connecting to nsqd - Error authenticating E_AUTH_FAILED AUTH failed
    main_test.go:44: Error authenticating E_AUTH_FAILED AUTH failed
--- FAIL: TestPush (0.03s)
FAIL
exit status 1
FAIL    gotet   0.065s

认证服务收到一条认证消息,密码是1234567

[GIN] 2022/04/17 - 16:17:35 | 403 |      42.509μs |  192.168.195.10 | GET      "/auth?common_name=&remote_ip=192.168.195.1&secret=1234567&tls=false"

认证服务收到一条认证消息,密码是1234567

[GIN] 2022/04/17 - 16:17:35 | 403 |      42.509μs |  192.168.195.10 | GET      "/auth?common_name=&remote_ip=192.168.195.1&secret=1234567&tls=false"

消息消费测试

执行订阅测试方法,密码不正确的时候 也会提示 身份验证失败

PS D:\workspaces\workgotest\gotest> go test -v -run TestSub1
=== RUN   TestSub1
2022/05/10 19:03:54 INF    1 [t1/c1] (192.168.195.10:4150) connecting to nsqd
2022/05/10 19:03:54 ERR    1 [t1/c1] (192.168.195.10:4150) Auth Failed Error authenticating E_AUTH_FAILED AUTH failed
    main_test.go:62: Error authenticating E_AUTH_FAILED AUTH failed
--- FAIL: TestSub1 (0.03s)
FAIL
exit status 1
FAIL    gotet   0.065s

密码正确后可以正常消费

PS D:\workspaces\workgotest\gotest> go test -v -run TestSub1
=== RUN   TestSub1
2022/05/10 19:05:13 INF    1 [t1/c1] (192.168.195.10:4150) connecting to nsqd
2022/05/10 19:05:13 INF    1 [t1/c1] (192.168.195.10:4150) Auth accepted. Identity: "zhimiaox-nsq-auth" http://localhost:1325 Permissions: 1
hello 0
hello 0
hello 1
hello 1

总结

1、验证方式略微麻烦,需要自己搭建部署认证服务
2、该认证方式仅对tcp访问方式有效,对http接口无效。需要隐藏http接口服务。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:43:29  更:2022-05-12 16:44:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/18 5:42:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码