# Gyber - 통합 자산 관리 시스템 **Gyber**는 사내 IT 자산을 효율적으로 관리하기 위한 통합 시스템입니다. Windows 클라이언트 PC의 하드웨어 정보를 PowerShell 스크립트로 자동 수집하고, Rust로 작성된 동기화 에이전트가 이를 중앙 데이터베이스에 반영합니다. 관리자는 Django로 제작된 웹 인터페이스를 통해 자산을 조회, 추가, 수정, 삭제하고, 사용자별 할당 현황 및 감사 로그를 확인할 수 있습니다. ## ✨ 주요 기능 * **💻 하드웨어 정보 자동 수집:** PowerShell 스크립트를 통해 CPU, 메모리, 디스크, VGA 등 상세 하드웨어 정보를 수집합니다. * **⚙️ Rust 기반 데이터 동기화:** Rust로 작성된 강력하고 안정적인 에이전트가 수집된 정보를 중앙 DB와 동기화합니다. * **🌐 웹 기반 관리 인터페이스:** Django 프레임워크를 사용하여 직관적인 웹 UI를 제공합니다. * 자산, 사용자, 그룹(부서), 카테고리의 CRUD(생성, 읽기, 수정, 삭제) 기능 * 강력한 검색, 필터링 및 정렬 기능 * 대시보드를 통한 자산 현황 요약 * 변경 이력 추적을 위한 상세 감사 로그 * **🔒 동기화 잠금 기능:** 웹에서 수동으로 입력하거나 중요한 자산 정보를 자동 동기화로부터 보호하는 잠금 기능 * **🔐 Azure AD 기반 SSO:** OpenID Connect(OIDC)를 통한 안전하고 편리한 사용자 인증 * **🎨 다크/라이트 모드 지원:** 사용자 편의를 위한 동적 테마 전환 * **📊 데이터 내보내기:** 현재 조회 중인 목록을 CSV 파일로 내보내기 ## 🛠️ 기술 스택 * **백엔드 (웹):** Python, Django * **백엔드 (동기화 에이전트):** Rust * **프론트엔드:** HTML, CSS, JavaScript, Bootstrap 5, Select2, Chart.js * **데이터베이스:** MariaDB / MySQL * **인프라:** Nginx, Gunicorn, systemd * **인증:** Azure Active Directory (OIDC) * **클라이언트 정보 수집:** PowerShell ## 🚀 시작하기 이 프로젝트는 크게 **웹 애플리케이션 (Django)**과 **데이터 동기화 에이전트 (Rust)**, 그리고 **DB 자격 증명 암호화 유틸리티 (Rust)**로 구성됩니다. ### 사전 준비 사항 * Ubuntu Server 22.04 LTS (또는 유사한 Linux 배포판) * MariaDB 또는 MySQL 데이터베이스 서버 * Rust 개발 환경 (rustup 권장) * Python 3.12+ 개발 환경 * Nginx * Azure Active Directory 테넌트 및 앱 등록 정보 (클라이언트 ID, 시크릿, 테넌트 ID) * (클라이언트 PC) PowerShell 5.1 이상 ### 1. 데이터베이스 설정 1. MariaDB/MySQL에 `gyber` 데이터베이스와 `gyber` 사용자를 생성하고 권한을 부여합니다. 2. 제공된 DB 스키마 파일 (`schema.sql` 등)을 사용하여 테이블과 저장 프로시저를 생성합니다. 3. **시간대 정보 로드 (필수):** DB 서버에서 다음 명령을 실행하여 시간대 정보를 로드합니다. ```bash sudo mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql ``` ### 2. Rust DB 자격 증명 암호화 유틸리티 (`rust_db_enc_creator`) 실행 이 유틸리티는 DB 접속 정보를 암호화하여 `db.enc` 파일을 생성합니다. 1. **`.env` 파일 생성:** `apps/rust_db_enc_creator/` 디렉토리에 `.env` 파일을 만들고 다음 내용을 작성합니다. ```env # apps/rust_db_enc_creator/.env ENCRYPTION_KEY="your-strong-32-byte-encryption-key-here" # 32바이트(256비트) 키 ``` 2. **유틸리티 실행:** ```bash cd apps/rust_db_enc_creator cargo run ``` 3. 실행이 완료되면 `apps/rust_db_enc_creator/` 디렉토리에 `db.enc` 파일이 생성됩니다. 이 파일을 **`apps/rust_gyber/config/` 디렉토리로 이동 또는 복사**합니다. ### 3. Rust 데이터 동기화 에이전트 (`rust_gyber`) 설정 및 실행 1. **환경 변수 설정:** `apps/rust_gyber/` 디렉토리에 `.env` 파일을 만들고 암호화 유틸리티에서 사용한 것과 동일한 `ENCRYPTION_KEY`를 설정합니다. ```env # apps/rust_gyber/.env ENCRYPTION_KEY="your-strong-32-byte-encryption-key-here" ``` 2. **설정 파일 확인:** `apps/rust_gyber/config/config.json` 파일의 `json_file_path`가 PowerShell 스크립트가 정보를 저장하는 공유 폴더 경로와 일치하는지 확인합니다. 3. **컴파일 및 실행:** ```bash cd apps/rust_gyber cargo build --release # 프로덕션용으로 빌드 ./target/release/gyber # 실행 ``` * 실제 운영 시에는 이 Rust 애플리케이션도 `systemd` 서비스로 등록하여 백그라운드에서 주기적으로 실행되도록 구성하는 것이 좋습니다. ### 4. Django 웹 애플리케이션 (`web`) 설정 및 배포 이 프로젝트는 Ubuntu 22.04 서버에서 Nginx와 Gunicorn을 사용하여 프로덕션 환경에 배포하는 것을 기준으로 합니다. 1. **프로젝트 클론 및 Python 가상환경 설정:** ```bash cd /data/gyber/apps # 예시 경로 git clone web cd web python3 -m venv vgyber source vgyber/bin/activate pip install -r requirements.txt ``` 2. **환경 변수 파일 생성:** `systemd` 서비스에서 사용할 환경 변수 파일을 생성합니다 (예: `/etc/gyber/gyber_prod.env`). ```bash sudo mkdir -p /etc/gyber sudo nano /etc/gyber/gyber_prod.env ``` 파일 내용: ```env DJANGO_SECRET_KEY="your_django_production_secret_key" DB_PASSWORD="your_database_password" OIDC_RP_CLIENT_ID="your_azure_ad_client_id" OIDC_RP_CLIENT_SECRET="your_azure_ad_client_secret" AZURE_TENANT_ID="your_azure_ad_tenant_id" # 기타 필요한 환경 변수 (DB_HOST, DB_USER, OIDC_RP_POST_LOGOUT_REDIRECT_URI 등) ``` 파일 권한을 설정합니다: `sudo chmod 600 /etc/gyber/gyber_prod.env` 3. **Django `settings.py` 확인:** `apps/web/config/settings.py` 파일이 프로덕션 환경에 맞게 설정되었는지 확인합니다 (`DEBUG = False`, 환경 변수 참조 등). 4. **`collectstatic` 실행:** ```bash # 가상 환경 활성화 상태에서 cd /data/gyber/apps/web python manage.py collectstatic --noinput ``` 5. **Gunicorn `systemd` 서비스 설정:** * `/etc/systemd/system/gunicorn_gyber.socket` 및 `/etc/systemd/system/gunicorn_gyber.service` 파일을 생성하고 제공된 파일 내용을 복사합니다. * 서비스 파일의 `User`, `Group`, `WorkingDirectory`, `ExecStart`, `EnvironmentFile` 경로가 실제 환경과 일치하는지 확인합니다. * 서비스 시작 및 활성화: ```bash sudo systemctl daemon-reload sudo systemctl start gunicorn_gyber.socket sudo systemctl enable gunicorn_gyber.socket sudo systemctl start gunicorn_gyber.service sudo systemctl enable gunicorn_gyber.service ``` 6. **Nginx 설정:** * SSL/TLS 인증서 파일들을 안전한 위치(예: `/etc/nginx/ssl/gyber.oneunivrs.com/`)에 준비합니다. * `/etc/nginx/sites-available/gyber_project` 설정 파일을 생성하고, `server_name`, `listen` 포트(`8438`), `ssl_certificate` 경로, `alias` 경로, `proxy_pass` 소켓 경로 등을 실제 환경에 맞게 수정합니다. * 설정 활성화 및 Nginx 재시작: ```bash sudo ln -s /etc/nginx/sites-available/gyber_project /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx ``` 7. **방화벽 설정:** ```bash sudo ufw allow 8438/tcp # HTTPS 포트 sudo ufw allow 80/tcp # HTTP->HTTPS 리디렉션 사용 시 ``` ### 5. 클라이언트 PC 설정 (PowerShell 스크립트) 1. `scripts/powershell/Collect-HWInfo.ps1` 스크립트를 클라이언트 PC에 배포합니다. 2. 스크립트 내의 `$saveDir` 변수를 실제 데이터가 저장될 네트워크 공유 폴더 경로로 수정합니다. 3. 이 스크립트가 각 PC에서 주기적으로 (예: 로그인 시 또는 예약된 작업으로) 실행되도록 설정합니다.