IAMZugriffskontrolle - Amazon Managed Streaming für Apache Kafka

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

IAMZugriffskontrolle

IAMMSKMit der Zugriffskontrolle für Amazon können Sie sowohl die Authentifizierung als auch die Autorisierung für Ihren MSK Cluster durchführen. Dies macht die Verwendung eines Mechanismus für die Authentifizierung und einen anderen für die Autorisierung überflüssig. Wenn ein Client beispielsweise versucht, in Ihren Cluster zu schreiben, prüft Amazon MSK anhand dieser Methode, ob es sich bei diesem Client IAM um eine authentifizierte Identität handelt und ob er berechtigt ist, für Ihren Cluster zu produzieren. IAMDie Zugriffskontrolle funktioniert für Java- und Nicht-Java-Clients, einschließlich Kafka-Clients, die in Python JavaScript, Go und geschrieben sind. NET.

Amazon MSK protokolliert Zugriffsereignisse, sodass Sie sie überprüfen können. Weitere Informationen finden Sie unter APIAnrufe protokollieren mit AWS CloudTrail.

Um die IAM Zugriffskontrolle zu ermöglichen, MSK nimmt Amazon geringfügige Änderungen am Apache Kafka-Quellcode vor. Diese Änderungen werden keinen spürbaren Unterschied in Ihrem Apache-Kafka-Erlebnis bewirken.

Wichtig

IAMDie Zugriffskontrolle gilt nicht für ZooKeeper Apache-Knoten. Weitere Informationen zum Steuern des Zugriffs auf diese Knoten finden Sie unter Steuern des Zugriffs auf Apache ZooKeeper.

Wichtig

Die allow.everyone.if.no.acl.found Apache Kafka-Einstellung hat keine Auswirkung, wenn Ihr Cluster die IAM Zugriffskontrolle verwendet.

Wichtig

Sie können Apache Kafka ACL APIs für einen MSK Cluster aufrufen, der Zugriffskontrolle verwendetIAM. Apache Kafka ACLs hat jedoch keine Auswirkung auf die Autorisierung von Rollen. IAM Sie müssen IAM Richtlinien verwenden, um den Zugriff auf IAM Rollen zu kontrollieren.

So MSK funktioniert die IAM Zugriffskontrolle für Amazon

Um die IAM Zugriffskontrolle für Amazon zu verwendenMSK, führen Sie die folgenden Schritte aus, die im Rest dieses Abschnitts ausführlich beschrieben werden.

Erstellen Sie einen Cluster, der die IAM Zugriffskontrolle verwendet

In diesem Abschnitt wird erklärt, wie Sie das verwenden können AWS Management Console, derAPI, oder der AWS CLI um einen Cluster zu erstellen, der die IAM Zugriffskontrolle verwendet. Informationen zum Aktivieren der IAM Zugriffskontrolle für einen vorhandenen Cluster finden Sie unterAktualisieren der Sicherheitseinstellungen eines Clusters.

Verwenden Sie den AWS Management Console um einen Cluster zu erstellen, der die IAM Zugriffskontrolle verwendet
  1. Öffnen Sie die MSK Amazon-Konsole unterhttps://console.aws.amazon.com/msk/.

  2. Wählen Sie Cluster erstellen.

  3. Wählen Sie Cluster mit benutzerdefinierten Einstellungen erstellen.

  4. Wählen Sie im Abschnitt Authentifizierung die Option IAMZugriffskontrolle aus.

  5. Führen Sie den Rest des Workflows zum Erstellen eines Clusters aus.

Verwenden Sie das API oder das AWS CLI um einen Cluster zu erstellen, der die IAM Zugriffskontrolle verwendet
  • Um einen Cluster mit aktivierter IAM Zugriffskontrolle zu erstellen, verwenden Sie den Befehl CreateClusterAPIoder den CLI Befehl create-cluster und übergeben Sie Folgendes JSON für den ClientAuthentication Parameter:. "ClientAuthentication": { "Sasl": { "Iam": { "Enabled": true } }

Konfigurieren Sie Clients für IAM die Zugriffskontrolle

Um Clients die Kommunikation mit einem MSK Cluster zu ermöglichen, der die IAM Zugriffskontrolle verwendet, können Sie einen der folgenden Mechanismen verwenden:

  • Konfiguration von Nicht-Java-Clients mit dem Mechanismus SASL _ OAUTHBEARER

  • Java-Client-Konfiguration mit SASL _ OAUTHBEARER Mechanism oder AWS_MSK _ IAM Mechanism

Verwenden des SASL OAUTHBEARER _-Mechanismus zur Konfiguration IAM

  1. Bearbeiten Sie Ihre client.properties-Konfigurationsdatei und nehmen Sie dafür die hervorgehobene Syntax im Python-Kafka-Beispielclient unten als Leitfaden. Konfigurationsänderungen sind in anderen Sprachen ähnlich.

    #!/usr/bin/python3from kafka import KafkaProducer from kafka.errors import KafkaError import socket import time from aws_msk_iam_sasl_signer import MSKAuthTokenProvider class MSKTokenProvider(): def token(self): token, _ = MSKAuthTokenProvider.generate_auth_token('<my aws region>') return token tp = MSKTokenProvider() producer = KafkaProducer( bootstrap_servers='<my bootstrap string>', security_protocol='SASL_SSL', sasl_mechanism='OAUTHBEARER', sasl_oauth_token_provider=tp, client_id=socket.gethostname(), ) topic = "<my-topic>" while True: try: inp=input(">") producer.send(topic, inp.encode()) producer.flush() print("Produced!") except Exception: print("Failed to send message:", e) producer.close()
  2. Laden Sie die Hilfsbibliothek für die von Ihnen gewählte Konfigurationssprache herunter und folgen Sie den Anweisungen im Abschnitt Erste Schritte auf der Homepage dieser Sprachbibliothek.

Verwenden Sie den MSK benutzerdefinierten AWS_MSK IAM _-Mechanismus zur Konfiguration IAM

  1. Fügen Sie der Datei client.properties Folgendes hinzu. Ersetzen <PATH_TO_TRUST_STORE_FILE> mit dem vollqualifizierten Pfad zur Trust Store-Datei auf dem Client.

    Anmerkung

    Wenn Sie ein bestimmtes Zertifikat nicht verwenden möchten, können Sie ssl.truststore.location=<PATH_TO_TRUST_STORE_FILE> aus Ihrer client.properties-Datei entfernen. Wenn Sie keinen Wert für ssl.truststore.location angeben, verwendet der Java-Prozess das Standardzertifikat.

    ssl.truststore.location=<PATH_TO_TRUST_STORE_FILE> security.protocol=SASL_SSL sasl.mechanism=AWS_MSK_IAM sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required; sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler

    Um ein benanntes Profil zu verwenden, das Sie erstellt haben für AWS Anmeldeinformationen, fügen Sie sie awsProfileName="your profile name"; in Ihre Client-Konfigurationsdatei ein. Informationen zu benannten Profilen finden Sie unter Benannte Profile im AWS CLI -Dokumentation.

  2. Laden Sie die neueste stabile aws-msk-iam-authJARDatei herunter und platzieren Sie sie im Klassenpfad. Wenn Sie Maven verwenden, fügen Sie die folgende Abhängigkeit hinzu und passen Sie die Versionsnummer nach Bedarf an:

    <dependency> <groupId>software.amazon.msk</groupId> <artifactId>aws-msk-iam-auth</artifactId> <version>1.0.0</version> </dependency>

Das MSK Amazon-Client-Plugin ist unter der Apache 2.0-Lizenz als Open Source verfügbar.

Autorisierungsrichtlinien erstellen

Fügen Sie der IAM Rolle, die dem Client entspricht, eine Autorisierungsrichtlinie hinzu. In einer Autorisierungsrichtlinie geben Sie an, welche Aktionen für die Rolle erlaubt oder verweigert werden sollen. Wenn sich Ihr Kunde auf einer EC2 Amazon-Instance befindet, ordnen Sie die Autorisierungsrichtlinie der IAM Rolle für diese EC2 Amazon-Instance zu. Alternativ können Sie Ihren Client so konfigurieren, dass er ein benanntes Profil verwendet, und dann die Autorisierungsrichtlinie der Rolle für dieses benannte Profil zuordnen. Konfigurieren Sie Clients für IAM die Zugriffskontrolle beschreibt, wie ein Client für die Verwendung eines benannten Profils konfiguriert wird.

Informationen zum Erstellen einer IAM Richtlinie finden Sie unter IAMRichtlinien erstellen.

Im Folgenden finden Sie ein Beispiel für eine Autorisierungsrichtlinie für einen Cluster mit dem Namen MyTestCluster. Informationen zur Semantik der Action- und Resource-Elemente finden Sie unter Semantik von Aktionen und Ressourcen.

Wichtig

Änderungen, die Sie an einer IAM Richtlinie vornehmen, spiegeln sich in der IAM APIs und der wider AWS CLI sofort. Es kann jedoch einige Zeit dauern, bis die Änderung der Richtlinie wirksam wird. In den meisten Fällen werden Richtlinien-Änderungen in weniger als einer Minute wirksam. Netzwerkbedingungen können die Verzögerung manchmal erhöhen.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kafka-cluster:Connect", "kafka-cluster:AlterCluster", "kafka-cluster:DescribeCluster" ], "Resource": [ "arn:aws:kafka:us-east-1:0123456789012:cluster/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1" ] }, { "Effect": "Allow", "Action": [ "kafka-cluster:*Topic*", "kafka-cluster:WriteData", "kafka-cluster:ReadData" ], "Resource": [ "arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/*" ] }, { "Effect": "Allow", "Action": [ "kafka-cluster:AlterGroup", "kafka-cluster:DescribeGroup" ], "Resource": [ "arn:aws:kafka:us-east-1:0123456789012:group/MyTestCluster/*" ] } ] }

Informationen zum Erstellen einer Richtlinie mit Aktionselementen, die gängigen Anwendungsfällen von Apache Kafka entsprechen, wie z. B. das Erzeugen und Verbrauchen von Daten, finden Sie unter Häufige Anwendungsfälle.

Für Kafka-Versionen 2.8.0 und höher ist die WriteDataIdempotentlyBerechtigung veraltet (-679). KIP enable.idempotence = true ist standardmäßig festgelegt. Daher bietet Kafka für die Versionen 2.8.0 und höher IAM nicht die gleiche Funktionalität wie Kafka. ACLs Es ist nicht möglich, WriteDataIdempotently in einem Thema auszuführen, wenn nur WriteData-Zugriff auf dieses Thema gewährt wird. Dies hat keinen Einfluss auf die Groß- und Kleinschreibung, in der es um WriteData Themen geht. ALL In diesem Fall ist WriteDataIdempotently erlaubt. Dies ist auf Unterschiede in der Implementierung der IAM Logik im Vergleich zur Implementierung von Kafka ACLs zurückzuführen.

Um dieses Problem zu umgehen, empfehlen wir, eine Richtlinie zu verwenden, die dem folgenden Beispiel ähnelt:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kafka-cluster:Connect", "kafka-cluster:AlterCluster", "kafka-cluster:DescribeCluster", "kafka-cluster:WriteDataIdempotently" ], "Resource": [ "arn:aws:kafka:us-east-1:0123456789012:cluster/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1" ] }, { "Effect": "Allow", "Action": [ "kafka-cluster:*Topic*", "kafka-cluster:WriteData", "kafka-cluster:ReadData" ], "Resource": [ "arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1/TestTopic" ] } ] }

In diesem Fall erlaubt WriteData Schreibvorgänge in TestTopic, während WriteDataIdempotently idempotente Schreibvorgänge in den Cluster erlaubt. Es ist wichtig zu beachten, dass WriteDataIdempotently eine Berechtigung auf Cluster-Ebene ist. Sie kann nicht auf Themenebene verwendet werden. Wenn WriteDataIdempotently auf die Themenebene beschränkt ist, funktioniert diese Richtlinie nicht.

Holen Sie sich die Bootstrap-Broker für die Zugriffskontrolle IAM

Siehe Die Bootstrap-Broker für einen Amazon-Cluster abrufen MSK.

Semantik von Aktionen und Ressourcen

In diesem Abschnitt wird die Semantik der Aktions- und Ressourcenelemente erläutert, die Sie in einer IAM Autorisierungsrichtlinie verwenden können. Eine Beispielrichtlinie finden Sie unter Autorisierungsrichtlinien erstellen.

Aktionen

In der folgenden Tabelle sind die Aktionen aufgeführt, die Sie in eine Autorisierungsrichtlinie aufnehmen können, wenn Sie die IAM Zugriffskontrolle für Amazon verwendenMSK. Wenn Sie in Ihre Autorisierungsrichtlinie eine Aktion aus der Spalte Aktion der Tabelle aufnehmen, müssen Sie auch die entsprechenden Aktionen aus der Spalte Erforderliche Aktionen angeben.

Aktion Beschreibung Erforderliche Aktionen Erforderliche -Ressourcen Gilt für Serverless-Cluster
kafka-cluster:Connect Gewährt die Berechtigung, sich mit dem Cluster zu verbinden und zu authentifizieren. None Cluster Ja
kafka-cluster:DescribeCluster Erteilt die Erlaubnis, verschiedene Aspekte des Clusters zu beschreiben, was dem von Apache Kafka entspricht. DESCRIBE CLUSTER ACL

kafka-cluster:Connect

Cluster Ja
kafka-cluster:AlterCluster Erteilt die Erlaubnis, verschiedene Aspekte des Clusters zu ändern, was denen von Apache Kafka entspricht. ALTER CLUSTER ACL

kafka-cluster:Connect

kafka-cluster:DescribeCluster

Cluster Nein
kafka-cluster:DescribeClusterDynamicConfiguration Erteilt die Erlaubnis, die dynamische Konfiguration eines Clusters zu beschreiben, was Apache Kafkas DESCRIBE _ entspricht. CONFIGS CLUSTER ACL

kafka-cluster:Connect

Cluster Nein
kafka-cluster:AlterClusterDynamicConfiguration Erteilt die Erlaubnis, die dynamische Konfiguration eines Clusters zu ändern, was Apache Kafkas ALTER _ entspricht. CONFIGS CLUSTER ACL

kafka-cluster:Connect

kafka-cluster:DescribeClusterDynamicConfiguration

Cluster Nein
kafka-cluster:WriteDataIdempotently Erteilt die Erlaubnis, Daten unabhängig voneinander auf einen Cluster zu schreiben, was Apache Kafkas _ entspricht. IDEMPOTENT WRITE CLUSTER ACL

kafka-cluster:Connect

kafka-cluster:WriteData

Cluster Ja
kafka-cluster:CreateTopic Erteilt die Berechtigung zum Erstellen von Themen in einem Cluster, was Apache Kafkas/entspricht. CREATE CLUSTER TOPIC ACL

kafka-cluster:Connect

Thema Ja
kafka-cluster:DescribeTopic Erteilt die Erlaubnis, Themen in einem Cluster zu beschreiben, was der von Apache Kafka entspricht. DESCRIBE TOPIC ACL

kafka-cluster:Connect

Thema Ja
kafka-cluster:AlterTopic Erteilt die Erlaubnis, Themen in einem Cluster zu ändern, was der von Apache Kafka entspricht. ALTER TOPIC ACL

kafka-cluster:Connect

kafka-cluster:DescribeTopic

Thema Ja
kafka-cluster:DeleteTopic Erteilt die Berechtigung zum Löschen von Themen in einem Cluster, was der von Apache Kafka entspricht. DELETE TOPIC ACL

kafka-cluster:Connect

kafka-cluster:DescribeTopic

Thema Ja
kafka-cluster:DescribeTopicDynamicConfiguration Erteilt die Erlaubnis, die dynamische Konfiguration von Themen in einem Cluster zu beschreiben, was Apache Kafkas DESCRIBE _ entspricht. CONFIGS TOPIC ACL

kafka-cluster:Connect

Thema Ja
kafka-cluster:AlterTopicDynamicConfiguration Erteilt die Erlaubnis, die dynamische Konfiguration von Themen in einem Cluster zu ändern, was Apache Kafkas ALTER _ entspricht. CONFIGS TOPIC ACL

kafka-cluster:Connect

kafka-cluster:DescribeTopicDynamicConfiguration

Thema Ja
kafka-cluster:ReadData Erteilt die Berechtigung zum Lesen von Daten aus Themen in einem Cluster, was der von Apache Kafka entspricht. READ TOPIC ACL

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:AlterGroup

Thema Ja
kafka-cluster:WriteData Erteilt die Berechtigung, Daten in Themen auf einem Cluster zu schreiben, was der von Apache Kafka entspricht WRITE TOPIC ACL

kafka-cluster:Connect

kafka-cluster:DescribeTopic

Thema Ja
kafka-cluster:DescribeGroup Erteilt die Erlaubnis, Gruppen in einem Cluster zu beschreiben, was der von Apache Kafka entspricht. DESCRIBE GROUP ACL

kafka-cluster:Connect

Gruppe Ja
kafka-cluster:AlterGroup Erteilt die Erlaubnis, Gruppen in einem Cluster beizutreten, was der von Apache Kafka entspricht. READ GROUP ACL

kafka-cluster:Connect

kafka-cluster:DescribeGroup

Gruppe Ja
kafka-cluster:DeleteGroup Erteilt die Berechtigung zum Löschen von Gruppen auf einem Cluster, was der von Apache Kafka entspricht. DELETE GROUP ACL

kafka-cluster:Connect

kafka-cluster:DescribeGroup

Gruppe Ja
kafka-cluster:DescribeTransactionalId Erteilt die Erlaubnis, Transaktionen IDs auf einem Cluster zu beschreiben, was der _ID von Apache Kafka entspricht. DESCRIBE TRANSACTIONAL ACL

kafka-cluster:Connect

transactional-id Ja
kafka-cluster:AlterTransactionalId Erteilt die Erlaubnis, Transaktionen in einem Cluster zu ändern, was IDs der _ID von Apache Kafka entspricht. WRITE TRANSACTIONAL ACL

kafka-cluster:Connect

kafka-cluster:DescribeTransactionalId

kafka-cluster:WriteData

transactional-id Ja

Sie können das Sternchen (*) als Platzhalter in einer Aktion hinter dem Doppelpunkt beliebig oft verwenden. Im Folgenden sind einige Beispiele aufgeführt.

  • kafka-cluster:*Topic steht für kafka-cluster:CreateTopic, kafka-cluster:DescribeTopic, kafka-cluster:AlterTopic und kafka-cluster:DeleteTopic. Es beinhaltet nicht kafka-cluster:DescribeTopicDynamicConfiguration oder kafka-cluster:AlterTopicDynamicConfiguration.

  • kafka-cluster:* steht für alle Berechtigungen.

Ressourcen

Die folgende Tabelle zeigt die vier Ressourcentypen, die Sie in einer Autorisierungsrichtlinie verwenden können, wenn Sie die IAM Zugriffskontrolle für Amazon verwendenMSK. Sie können den Cluster-Amazon-Ressourcennamen (ARN) von der AWS Management Console oder indem Sie den DescribeClusterAPIoder den Describe-Cluster verwenden AWS CLI Befehl. Anschließend können Sie den Cluster verwenden, ARN um Themen-, Gruppen- und Transaktions-IDs zu erstellen. ARNs Um eine Ressource in einer Autorisierungsrichtlinie anzugeben, verwenden Sie die dieser Ressource. ARN

Ressource ARNFormat
Cluster arn:aws:kafka:region:account-id:Cluster/cluster-name/cluster-uuid
Thema arn:aws:kafka:region:account-id:thema/cluster-name/cluster-uuid/topic-name
Gruppe arn:aws:kafka:region:account-id:gruppe/cluster-name/cluster-uuid/group-name
Transkaktions-ID arn:aws:kafka:region:account-id: Transaktions-ID/cluster-name/cluster-uuid/transactional-id

Sie können das Sternchen (*) als Platzhalter beliebig oft an beliebiger Stelle in dem Teil von verwenden, der nachARN,, und steht. :cluster/ :topic/ :group/ :transactional-id/ Im Folgenden finden Sie einige Beispiele dafür, wie Sie das Sternchen (*) als Platzhalter verwenden können, um auf mehrere Ressourcen zu verweisen:

  • arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/*: alle Themen in einem beliebigen Cluster mit dem Namen MyTestCluster, unabhängig vom Namen des Clusters. UUID

  • arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1/*_test: alle Themen, deren Name mit „_test“ endet, in dem Cluster, dessen Name MyTestCluster und dessen Name UUID abcd1234-0123-abcd-5678-1234abcd-1 ist.

  • arn:aws:kafka:us-east-1:0123456789012:transactional-id/MyTestCluster/*/5555abcd-1111-abcd-1234-abcd1234-1: alle Transaktionen, deren Transaktions-ID 5555abcd-1111-abcd-1234-abcd1234-1 lautet, in allen Inkarnationen eines Clusters, der in Ihrem Konto benannt ist. MyTestCluster Das heißt, wenn Sie einen Cluster mit dem Namen erstellen MyTestCluster, ihn dann löschen und dann einen weiteren Cluster mit demselben Namen erstellen, können Sie diese Ressource verwenden, um dieselbe Transaktions-ID auf beiden Clustern darzustellen. ARN Auf den gelöschten Cluster kann jedoch nicht zugegriffen werden.

Häufige Anwendungsfälle

Die erste Spalte der folgenden Tabelle zeigt einige gängige Anwendungsfälle. Um einen Client zur Ausführung eines bestimmten Anwendungsfalls zu autorisieren, nehmen Sie die für diesen Anwendungsfall erforderlichen Aktionen in die Autorisierungsrichtlinie des Clients auf und stellen Sie Effect auf Allow ein.

Informationen zu allen Aktionen, die Teil der IAM Zugriffskontrolle für Amazon sindMSK, finden Sie unterSemantik von Aktionen und Ressourcen.

Anmerkung

Aktionen werden standardmäßig verweigert. Sie müssen jede Aktion, zu deren Ausführung Sie den Client autorisieren möchten, ausdrücklich erlauben.

Anwendungsfall Erforderliche Aktionen
Admin.

kafka-cluster:*

Erstellen eines Themas

kafka-cluster:Connect

kafka-cluster:CreateTopic

Daten produzieren

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:WriteData

Daten verbrauchen

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:DescribeGroup

kafka-cluster:AlterGroup

kafka-cluster:ReadData

Daten idempotent produzieren

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:WriteData

kafka-cluster:WriteDataIdempotently

Daten transaktionell produzieren

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:WriteData

kafka-cluster:DescribeTransactionalId

kafka-cluster:AlterTransactionalId

Die Konfiguration eines Clusters beschreiben

kafka-cluster:Connect

kafka-cluster:DescribeClusterDynamicConfiguration

Die Konfiguration eines Clusters aktualisieren

kafka-cluster:Connect

kafka-cluster:DescribeClusterDynamicConfiguration

kafka-cluster:AlterClusterDynamicConfiguration

Die Konfiguration eines Themas beschreiben

kafka-cluster:Connect

kafka-cluster:DescribeTopicDynamicConfiguration

Die Konfiguration eines Themas aktualisieren

kafka-cluster:Connect

kafka-cluster:DescribeTopicDynamicConfiguration

kafka-cluster:AlterTopicDynamicConfiguration

Ein Thema ändern

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:AlterTopic