gitea清理垃圾账户和仓库

前情提要

由于本人需要在多个设备上同步一些个人的代码,有些时候需要给朋友展示一些内容(主要是写的readme,即如何使用),所以在个人的服务器上部署了1Panel,然后应用商店安装了gitea,但是近日突然发现我的gitea上面有近2W个账户,并且下面都是一些垃圾信息的git仓库。所以,想起来,我并没有关闭注册,原本想着给朋友注册用的,但是我还是太嫩了,忽略了脚本攻击的威力。不幸中招,那就清理吧。

第一步:关闭注册

在我的部署环境下(1panel+应用商店部署gitea),在/opt/1panel/apps/gitea/gitea/data/gitea/conf目录下可以看到gitea的app.ini文件。

修改它的内容,主要是以下内容:

[service]
DISABLE_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = false

第一个是关闭注册,一定要关闭 ,非常重要。
第二个是不登陆是否能看见,如果纯个人用,可以关闭,但是我需要展示,所以暂时先不关了。

第二步:清理垃圾

这里借鉴了网上一位大佬的脚本文件
Gitea-垃圾用户处理办法

不过,我这里因为gitea是部署在docker内的,需要借助HOST机器的python3的,同时还要安装对应的包
sudo python3 -m pip install requests

然后我也用AI工具对脚本稍微修改了一下

#!/usr/bin/env python3
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# ========== 配置区 ==========
gitea_url = 'https://gitea.url'            # 末尾不要带斜杠
api_token = 'API Token'
keep_user = {'hulk, 'admin'}               # 需要保留的账号
# ========== 配置结束 ==========

headers = {
    'Authorization': f'token {api_token}'
}

def delete_user_repositories(username: str) -> None:
    """删除指定用户的全部仓库"""
    repos_api = f'{gitea_url}/api/v1/users/{username}/repos'
    resp = requests.get(repos_api, headers=headers, verify=False)
    if resp.status_code != 200:
        print(f'  [WARN] 获取 {username} 的仓库失败,HTTP {resp.status_code}')
        return

    for repo in resp.json():
        repo_name = repo['name']
        del_repo_api = f'{gitea_url}/api/v1/repos/{username}/{repo_name}'
        r = requests.delete(del_repo_api, headers=headers, verify=False)
        if r.status_code == 204:
            print(f'  [OK]   删除仓库 {username}/{repo_name}')
        else:
            print(f'  [ERR]  删除仓库 {username}/{repo_name} 失败,HTTP {r.status_code}')

def main() -> None:
    users_api = f'{gitea_url}/api/v1/admin/users'
    resp = requests.get(users_api, headers=headers, verify=False)
    if resp.status_code != 200:
        print(f'[ERR] 获取用户列表失败,HTTP {resp.status_code}')
        return

    for user in resp.json():
        username = user['username']
        if username == keep_user:
            print(f'[SKIP] 保留用户 {username}')
            continue

        print(f'[PROC] 处理用户 {username}')
        delete_user_repositories(username)

        del_user_api = f'{gitea_url}/api/v1/admin/users/{username}'
        r = requests.delete(del_user_api, headers=headers, verify=False)
        if r.status_code == 204:
            print(f'[OK]   删除用户 {username}')
        else:
            print(f'[ERR]  删除用户 {username} 失败,HTTP {r.status_code}')

if __name__ == '__main__':
    main()

第三步:补充信息

在脚本的前面几行,可以看见,需要你填入你的gitea的地址,后面千万不要有/,然后需要你用管理员账户在网站的设置里面创建一个全部权限的token,然后复制到配置的第二行,最后,第三行,填写你要保留的账户即可。

第四步:开始清理

使用python3调用前面的脚本即可

python3 clean.py

结语

我的垃圾清理就一个多小时,以后任何开放在网络上的应用,都要注意网络安全,并且这种非事故性的安全也是安全啊,说多了都是泪。。。大家多多注意。

最后修改:2025 年 08 月 25 日
如果觉得我的文章对你有用,请随意赞赏