---
title: "OpenStack 수동 설치 2 — Keystone 인증 서비스 설치"
description: "OpenStack Keystone 인증 서비스를 설치하고 DB 생성, 패키지 설치, Fernet 초기화, bootstrap, 사용자·프로젝트·역할 생성 및 토큰 검증까지 순차적으로 수행하는 가이드입니다."
date: "2026-07-31"
last_modified: "2026-08-28T00:13:00.000Z"
type: "Post"
tags:
  - "openstack"
  - "install"
  - "ubuntu"
  - "mysql"
categories:
  - "📗 Docs"
series:
  - "오픈스택 설치"
canonical_url: "https://blog.pieroot.xyz/openstack-keystone"
markdown_url: "https://blog.pieroot.xyz/openstack-keystone.md"
---

# OpenStack 수동 설치 2 — Keystone 인증 서비스 설치

OpenStack Keystone 인증 서비스를 설치하고 DB 생성, 패키지 설치, Fernet 초기화, bootstrap, 사용자·프로젝트·역할 생성 및 토큰 검증까지 순차적으로 수행하는 가이드입니다.

기본 환경과 공통 서비스를 준비했다면 가장 먼저 설치할 OpenStack 서비스는 Keystone이다. Keystone은 인증, 권한, 서비스 카탈로그를 담당하며 다른 서비스가 서로 통신하기 위한 출발점이 된다.

이번 글에서는 **DB 생성 → Keystone 설치 → Fernet 초기화 → bootstrap → 사용자와 프로젝트 생성 → 토큰 검증** 순서로 진행한다.

### 이 글에서 다루는 내용

- Keystone의 User, Project, Role, Domain, Endpoint, Token

- Keystone DB와 패키지 설치

- Fernet 및 credential 키 초기화

- 관리자와 identity 엔드포인트 bootstrap

- 일반 사용자와 서비스 프로젝트 생성

- `admin-openrc` 작성과 토큰 검증

> **전제 환경**
> 
> - controller `192.168.56.101`
> 
> - MariaDB와 Memcached 설치 완료
> 
> - OpenStack 2026.1 (Gazpacho)
> 
> - 명령의 `KEYSTONE_DBPASS`, `ADMIN_PASS`, `MYUSER_PASS`는 실제 값으로 교체

### 1. Keystone 데이터베이스 생성

```bash
sudo mysql
```

```sql
CREATE DATABASE keystone;
CREATE USER 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost';
CREATE USER 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%';
FLUSH PRIVILEGES;
EXIT;
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=50468c01-15b1-4098-9635-7c8b788cfeca&kind=s3&pageId=ca48ee79-d61a-442f-95ba-db90c0cbef77&source=block&blockId=8bd75572-ac98-40fc-b7be-0af304107d82)

```bash
mysql -u keystone -p -e "SHOW DATABASES;"
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=d474d9eb-f2e8-4906-beeb-3f29ef6e39a1&kind=s3&pageId=ca48ee79-d61a-442f-95ba-db90c0cbef77&source=block&blockId=57794d4f-b137-47be-a124-685e8e910e0d)

### 2. 패키지 설치와 설정

```bash
sudo apt install -y keystone
```

`/etc/keystone/keystone.conf`의 해당 섹션을 수정한다.

```
[database]
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

[token]
provider = fernet
```

기본 SQLite `connection`이 남아 있으면 새 설정과 충돌할 수 있으므로 주석 처리하거나 제거한다.

### 3. DB 스키마와 키 초기화

```bash
sudo su -s /bin/sh -c "keystone-manage db_sync" keystone
sudo keystone-manage fernet_setup \
  --keystone-user keystone --keystone-group keystone
sudo keystone-manage credential_setup \
  --keystone-user keystone --keystone-group keystone
```

```bash
sudo mysql -e "USE keystone; SHOW TABLES;" | head
sudo ls -l /etc/keystone/fernet-keys/
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=8a5f603c-bf27-4a8f-935d-57605146391f&kind=s3&pageId=ca48ee79-d61a-442f-95ba-db90c0cbef77&source=block&blockId=b10cde13-557b-483e-b7d1-836bd3defb96)

### 4. 관리자와 엔드포인트 bootstrap

```bash
sudo keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
  --bootstrap-admin-url http://controller:5000/v3/ \
  --bootstrap-internal-url http://controller:5000/v3/ \
  --bootstrap-public-url http://192.168.56.101:5000/v3/ \
  --bootstrap-region-id RegionOne
```

이 명령은 admin 사용자와 프로젝트, admin 역할, identity 서비스, RegionOne, 엔드포인트 3종을 한 번에 만든다.

public URL에 IP를 사용하면 호스트 PC가 `controller` 이름을 해석하지 못해도 API에 접근할 수 있다.

### 5. Apache 설정과 API 확인

```bash
echo "ServerName 192.168.56.101" | sudo tee -a /etc/apache2/apache2.conf
sudo apache2ctl configtest
sudo systemctl restart apache2
curl -i http://controller:5000/v3/
```

JSON 버전 정보가 반환되면 API가 정상이다.

> `curl`이 403 또는 500을 반환한다면 Apache 설정과 WSGI 스크립트를 먼저 확인한다. Keystone은 별도 systemd API 데몬이 아니라 Apache `mod_wsgi` 아래에서 동작한다.

### 6. 관리자 환경 변수

```bash
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
```

```bash
openstack token issue
```

### 7. 서비스 프로젝트와 일반 사용자 생성

`default` 도메인은 bootstrap에서 이미 생성된다. 새 도메인이 필요할 때만 다음 명령을 실행한다.

```bash
openstack domain create --description "An Example Domain" example
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=da57ca35-8594-40ff-97f2-b12a1bcb5ae8&kind=s3&pageId=ca48ee79-d61a-442f-95ba-db90c0cbef77&source=block&blockId=9ae37dac-5dee-482e-bc52-7160257bdd05)

```bash
openstack project create --domain default \
  --description "Service Project" service
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=3d9f5e3e-6369-41bc-ace6-17b00d087c19&kind=s3&pageId=ca48ee79-d61a-442f-95ba-db90c0cbef77&source=block&blockId=106122f5-d182-4336-a957-f0816c1754e3)

```bash
openstack project create --domain default \
  --description "Demo Project" myproject

openstack user create --domain default --password-prompt myuser
openstack role create myrole
openstack role add --project myproject --user myuser myrole
```

`role add`는 성공해도 출력이 없을 수 있다.

### 8. openrc 파일 작성

`~/admin-openrc`를 만든다.

```bash
cat > ~/admin-openrc <<'EOF'
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF
```

```bash
source ~/admin-openrc
openstack token issue
openstack service list
openstack endpoint list
openstack project list
openstack user list
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=283bcf41-6246-4ac4-b5fc-44a3d4d14283&kind=s3&pageId=ca48ee79-d61a-442f-95ba-db90c0cbef77&source=block&blockId=a26ff1c6-c378-48a6-8694-775f3799238e)

### 오류를 확인하는 순서

### 핵심 정리

1. Keystone은 모든 OpenStack API 요청의 인증 출발점이다.

1. `bootstrap`은 첫 관리자와 identity 카탈로그를 한 번에 만든다.

1. 이후 서비스 설치에서는 `service` 프로젝트에 서비스 사용자를 추가한다.

### 재발 방지 체크리스트

- [ ] Keystone DB와 테이블이 생성됐다.

- [ ] Fernet 키 파일이 존재한다.

- [ ] 포트 5000에서 API가 응답한다.

- [ ] identity 엔드포인트 3종이 등록됐다.

- [ ] admin과 일반 사용자 모두 토큰을 발급받는다.

- [ ] `admin-openrc`가 정상 동작한다.

### 다음 단계

다음 글에서는 이미지 서비스 **Glance를 설치하고 CirrOS 이미지를 등록**한다.

### 참고 자료

- [Keystone Installation Tutorial for Ubuntu](https://docs.openstack.org/keystone/2026.1/install/index-ubuntu.html)

- [OpenStack Minimal Deployment — 2026.1 Gazpacho](https://docs.openstack.org/install-guide/openstack-services.html#minimal-deployment-for-2026-1-gazpacho)
