本文主要介绍ssh免密访问Ubuntu。

前言

What is SSH:

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题

SSH广泛使用的协议,用于安全的访问Linux服务器。

今天我们主要介绍ssh免密访问Ubuntu,其中:

  • 客户端(mac)
  • 服务器(Ubuntu)

实现步骤大致如下:

  1. 安装ssh服务
  2. ssh客户端生成生成公钥和私钥
  3. 上传公钥到服务器

安装ssh的服务端

在Ubuntu安装ssh服务(这里我使用的是vm默认安装):

sudo apt-get install openssh-server

重启服务

service ssh restart

ssh生成密钥

在Mac,生成密钥的命令:

ssh-keygen

生成的密钥路径: $HOME/.ssh 查看是否生成成功:

cd $HOME/.ssh
ls
id_rsa      id_rsa.pub

说明生成成功,其中id_rsa为私钥、id_rsa.pub为公钥。公钥将上传到你要连接的服务器,而私钥则存储在你将用来建立连接的计算机上。接着,将公钥钥上传到Ubuntu:

ssh-copy-id userName@ServerIp

Eg:

ssh-copy-id jefffff@192.168.1.88

接着,查看是否上传成功, 密钥会增加到Ubuntu,路径为$HOME/.ssh/authorized_key

免密访问

接着就可以ssh免密访问服务器了:

ssh -i ~/.ssh/id_rsa -p 22 -l userName ServerIp

Eg::

 [master] ssh -i ~/.ssh/id_rsa -p 22 -l jefffff 192.168.1.88
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-131-generic x86_64)
... 省略一些

*** System restart required ***
Last login: Sat Dec  9 09:21:34 2022 from 192.168.1.33
jeffffff@ubuntu1~$

说明,登入成功。

iterm2配置

为了更方便的访问,可以在iterm2(mac)配置

小结

使用SSH的访问Linux方式有密码和密钥两种方式,使用密钥相对于默认的密码方式优点有: 其一,密码更容易被暴力破解,密钥访问更安全。 其二,亦可通过修改sshd_config配置,来开闭用户对服务器的访问。 文中还通过一个Mac密钥登入Ubuntu的例子,来演示免密访问过程。

参考

最近在日常运维过程,发现挖矿病毒利用GitLab的CVE-2021-22205漏洞,消耗服务器的资源。为了彻底解决问题,决定对GitLab进行迁移和版本升级。

前提

服务器 OS GitLabVersion 备注
原始服务器A Ubuntu 13.7.4 下文简称ServerA
迁移目标服务器B Ubuntu 15.3.3 下文简称原ServerB

大致步骤:

  1. ServerA:备份GitLab
  2. ServerB:恢复GitLab
  3. ServerB:更新GitLab版本

备份

数据

这里我们是用DockerCompose运行的GitLab-13.7.4,从主机运行备份: GitLab 12.2 或更高版本:

$docker exec -t <container name> gitlab-backup create

GitLab 12.1 及更早版本:

$docker exec -t <container name> gitlab-rake gitlab:backup:create

开始备份:

$ docker exec -t 985506cf361c gitlab-rake gitlab:backup:create
2022-09-16 02:56:34 +0000 -- Dumping database ...
Dumping PostgreSQL database gitlabhq_production ... [DONE]
...
Backup task is done.

查看备份文件: 默认的备份路径为 /var/opt/gitlab/backups,如果不知道保存路径,可以从容器的 /etc/gitlab/gitlab.rb 文件,查找 gitlab_rails[‘backup_path’] = “/var/opt/gitlab/backups” 此为备份目录。

$ docker exec -it 985506cf361c bash
root@985506cf361c:/# cd /var/opt/gitlab/backups
root@985506cf361c:/var/opt/gitlab/backups# ls
123456_2022_09_16_13.7.4—_gitlab_backup.tar

将容器数据备份拷贝到主机的当前目录

docker cp gitlab:/var/opt/gitlab/backups/123456_2022_09_16_13.7.4_gitlab_backup.tar  ~/

配置

GitLab 提供的备份 Rake 任务不存储您的配置文件,故而这里需要收到备份

/etc/gitlab/gitlab-secrets.json
/etc/gitlab/gitlab.rb

再将配置备份拷贝到主机的当前目录

docker cp gitlab:/etc/gitlab  ~/

迁移

相同版本启动

docker-compose.yaml 示例如下

version: '3.3'
services:
  web:
    image: gitlab/gitlab-ce:13.7.4-ce.0
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.example.com'
        # Add any other gitlab.rb configuration here, each on its own line        
    ports:
      - '80:80'
      - '443:443'
      - '22:22'
    volumes:
      - './volumes/gitlab/config:/etc/gitlab'
      - './volumes/gitlab/logs:/var/log/gitlab'
      - './volumes/gitlab/data:/var/opt/gitlab'
    shm_size: '256m'

配置

数据

将ServerA的备份拷贝到ServerB

docker cp 1123456_2022_09_16_13.7.4_gitlab_backup.tar gitlab:/var/opt/gitlab/backups/

进入容器

停止连接到数据库的进程。让 GitLab 的其余部分继续运行

root@23b5e49fc9ea:/var/opt/gitlab/backups# gitlab-ctl stop unicorn
root@23b5e49fc9ea:/var/opt/gitlab/backups# gitlab-ctl stop sidekiq
ok: down: sidekiq: 0s, normally up
root@23b5e49fc9ea:/var/opt/gitlab/backups# gitlab-ctl status

备份文件必须是git用户所有者(root下导入才需要)

# chown -R git:git /var/opt/gitlab/backups/备份.tar

开始还原备份

root@23b5e49fc9ea:/var/opt/gitlab/backups# gitlab-rake gitlab:backup:restore BACKUP=123456_2022_09_16_13.7.4
Unpacking backup ... done

Do you want to continue (yes/no)? yes
...
Do you want to continue (yes/no)? yes

Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data
and are not included in this backup. You will need to restore these files manually.
Restore task is done.

启动GitLab

root@23b5e49fc9ea:/var/opt/gitlab/backups# gitlab-ctl start

登入http://ServerB,检查GitLab正常运行。

更新GitLab版本

接着开始更新版本,这里采用的停机升级方案,耗时较久(大概3~4小时),所以需要选择适当时机更新。更新路线: 13.7.4-> 13.8.8->13.12.15-> 14.0.12-> 14.3.6=>14.6.2-> 14.9.5-> 14.10.5-> 15.0.2->15.1.0

services:
   gitlab:
    image: gitlab/gitlab-ce:15.3.3-ce.0
#    image: gitlab/gitlab-ce:15.1.0-ce.0
#    image: gitlab/gitlab-ce:15.0.2-ce.0
#    image: gitlab/gitlab-ce:14.10.5-ce.0
#    image: gitlab/gitlab-ce:14.9.5-ce.0
#    image: gitlab/gitlab-ce:14.6.2-ce.0
#    image: gitlab/gitlab-ce:14.3.6-ce.0
#    image: gitlab/gitlab-ce:14.0.12-ce.0
#    image: gitlab/gitlab-ce:13.12.15-ce.0
#    image: gitlab/gitlab-ce:13.8.8-ce.0
#    image: gitlab/gitlab-ce:13.7.4-ce.0

遇到的问题

  1. 在使用备份恢复GitLab时卡住
$ docker exec -it 7ddbcc0a6eb2 gitlab-rake gitlab:backup:restore BACKUP=1123456_2022_09_16_13.7.4
Unpacking backup ... done
Do you want to continue (yes/no)? yes

处理方式:进入容器,授权,执行恢复

# chown -R git:git /var/opt/gitlab/backups/备份.tar
root@23b5e49fc9ea:/var/opt/gitlab/backups# gitlab-rake gitlab:backup:restore 

备注:增加 gitlab-rake gitlab:backup:restore –trace 查看详细信息.

参考

上篇传送门介绍和搭建 GrafanaLoki,今天学习实战收集dockers容器的日志。

Grafana Loki 支持以下官方客户端发送日志:

  • Promtail
  • Docker Driver
  • Fluentd
  • Fluent Bit
  • Logstash
  • Lambda Promtail

其中我们关注比较多是:

  • Promtail 是运行 Kubernetes 时的首选客户端,因为您可以将其配置为自动从运行 Promtail 的同一节点上运行的 pod 中抓取日志
  • Docker Logging Driver 当使用 Docker 而不是 Kubernetes 时,应该使用 Loki 的 Docker 日志记录驱动程序,因为它会自动添加适合正在运行的容器的标签。

Docker Driver

Grafana Loki 官方支持一个 Docker 插件,该插件将从 Docker 容器中读取日志并将它们发送到 Loki

安装

在每台 Docker 主机安装插件

docker plugin install grafana/loki-docker-driver:latest –alias loki –grant-all-permissions

检查是否安装成功:

docker plugin ls

$ docker plugin ls
ID             NAME          DESCRIPTION           ENABLED
2aa05FooBar   loki:latest   Loki Logging Driver   true

插件的使用可以有两种方式:

  • 配置全局 daemon.json,收集此后创建的所有容器的日志。
  • 运行容器时指定logging类型为loki

这里我们采用第一种方式

配置全局 daemon.json

sudo vi /etc/docker/daemon.json

{
    "log-driver": "loki",
    "log-opts": {
        "loki-url": "http://127.0.0.1:3100/loki/api/v1/push"
    }
}

重启docker服务

sudo systemctl restart docker

查看是否生效

docker info

$docker info
...
Logging Driver: loki

说明配置生效。

测试

启动测试服务,打开grafana查看,数据源选择 “Loki”。 搜索选择 compose-service ,由于这边是使用docker-compose启动的服务。 选择 “你的测试服务”,显示如下。

至此,已经成功收集docker的日志。

小结

本篇主要介绍如何利用 Docker Driver插件和配置本地环境来收集dockers日志到loki。

reference

为了快速定位、排查问题的,那么需要一个日志聚合、搜索的工具或者系统。

简介

Loki是一个受普罗米修斯启发的水平可伸缩、高可用性、多租户日志聚合系统。它的设计是非常有效的成本和易于操作。它不索引日志的内容,而是为每个日志流设置一组标签。

相关组件

  • Loki是主服务器,负责存储日志和处理查询。
  • Promtail是代理,负责收集日志并将其发送给 loki 。
  • Grafana用于 UI 展示。

部署

这里在Linux环境下,使用docker-compose的方式部署, 采集os的日志,主要分以下几个步骤:

  1. 启动 loki 、promtail、grafana
  2. 配置日志收集方式
  3. 观测日志是否采集、聚合

启动 loki 、promtail、grafana

在工作目录底下创建 docker-compose.yaml

version: "3"

networks:
  loki:

services:
  loki:
    image: grafana/loki:latest
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log
    command: -config.file=/etc/promtail/config.yml
    networks:
      - loki

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    networks:
      - loki

查看是否启动:

docker-compose ls

输出:

smartgo$ docker-compose ls
NAME                STATUS              CONFIG FILES
xloki               running(3)          /home/smartgo/xloki/docker-compose.yaml

配置数据源

访问Grafana: yournode:3000 ,选择数据源:Explore–DataSource 可以看到Grafana支持的数据源,点击选择 Loki 设置地址为:

http://loki:3100

保存即可,点击 SaveAndTest

观测日志是否采集、聚合

搜索日志,选择数据源Loki,选择文件类型和文件路径,具体如下

小结

本文主要初步介绍日志聚合、搜索系统Loki,以及如何docker部署,Grafana配置,搜索日志。

ToDo

reference

jefffff

Stay hungry. Stay Foolish COOL

Go backend developer

China Amoy